首页 > 解决方案 > 将时间戳附加到从 AWK 脚本生成的日志条目

问题描述

该脚本已经将输出记录到一个名为“server_mon.txt”的文件中。我想为每个条目附加一个时间戳,以便跟踪服务器活动。

我现在明白标准 AWK 没有可以轻松分配给变量的固有时间/日期函数。我尝试了以下但对我不起作用:

tail -fn0 /var/log/user | /usr/bin/awk '
BEGIN {
    str = "date +%Y-%m-%d";
    str = | getline date;
    close str;

以下是我到目前为止的完整脚本:

#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

tail -fn0 /var/log/user | /usr/bin/awk '
    /disconnect_tcp_conn/ { report("down") }
    /daemon apps started/  { report("up") }

    function report(curr_state,    msg) {
        if ( prev_state != curr_state ) {
            msg = "Server is " curr_state
            system("mail -s \047" msg "\047 mail@gmail.com </dev/null")
            print msg | "cat>&2"
            prev_state = curr_state
        }
    }
'

 &
PID=$!

DIEAT=`expr $SECONDS + 58`
while [ -d /proc/$PID ] && [ "$SECONDS" -lt "$DIEAT" ]
do
        sleep 1
done

[ -d /proc/$PID ] && kill "$PID"
wait

期望看到与 server_mon.txt 的每个日志条目相关联的时间戳。

谢谢

标签: bashshellawkcentos5

解决方案


我强烈建议您只阅读和打印日志文件中已经存在的时间戳,但如果这不是某些 reson 的选项,那么您可以选择:

枪awk:

$ awk 'BEGIN{ timestamp = strftime("%F %T"); print timestamp }'
2019-05-17 18:40:56

任何 awk(由于每次调用都生成一个 shell,效率要低得多date):

$ awk 'BEGIN{ cmd="date \"+%F %T\""; timestamp=( (cmd | getline line) > 0 ? line : "N/A"); print timestamp }'
2019-05-17 18:40:59

将代码放在需要生成时间戳的地方,我只是放在BEGIN部分来演示如何编写代码生成时间戳并将其保存在变量中。


推荐阅读