将时间戳附加到从 AWK 脚本生成的日志条目

Append timestamp to log entries generated from AWK script

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

我现在了解到标准 AWK 没有可以轻松分配给变量的固有 time/date 函数。我尝试了以下但对我不起作用:

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 7" msg "7 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 的每个日志条目关联的时间戳。

谢谢

除非我不了解你的环境...

systime() returns 自 1970 年 1 月 1 日以来的秒数

mktime(datespec) 和 strftime([format [ timestamp[ utc-flag]]]) 将该时间戳转换为有用的字符串。

参见: https://www.tutorialspoint.com/awk/awk_time_functions.htm 了解详情。

假设日志文件中的每一行都是一个日志条目。

如果你想将时间戳附加到文件中的每一行。这是 awk 脚本:

awk '{ print(strftime(), [=10=]); }' input.txt

要了解有关 awk 时间和数据功能的更多信息,请阅读 documentation here

strftime() 函数可以使用参数配置为您的 date/time 格式。

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

枪 awk:

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

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

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

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

我知道还有其他答案,但以防万一有人想知道我最终使用了什么并为我的目的工作..这里是:

 msg = "%m/%d/%Y %H:%M:%S 

print strftime(msg) | "tee -a

我最终使用 GAWK 而不是 AWK

这让我可以在 GAWK 的日志文件中找到时间和日期。

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

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

    function report(curr_state,    msg) {
        if ( prev_state != curr_state ) {
            msg = "%m/%d/%Y %H:%M:%S "Server is " curr_state
            system("mail -s 7" strftime(msg) "7 mail@gmail.com </dev/null")
            # print msg | "cat>&2"
            print strftime(msg) | "tee -a 7/var/log/server_mon.txt7 >&2"
            prev_state = curr_state
        }
    }
'