附加时间戳以记录从AWK脚本生成的条目

时间:2019-05-17 21:45:09

标签: bash shell awk centos5

该脚本已经将输出记录到名为“ 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的每个日志条目关联的时间戳。

谢谢

4 个答案:

答案 0 :(得分:1)

我强烈建议您仅读取和打印日志文件中已经存在的时间戳记,但是如果某些原因无法解决,那么您可以选择以下方法:

枪支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部分中演示了如何编写代码以生成时间戳并将其保存在变量中。

答案 1 :(得分:0)

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

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

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

请参阅: https://www.tutorialspoint.com/awk/awk_time_functions.htm 有关详细信息。

答案 2 :(得分:0)

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

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

awk '{ print(strftime(), $0); }' input.txt

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

strftime()功能可以通过参数配置为日期/时间格式。

答案 3 :(得分:0)

我知道还有其他答案,但万一有人想知道我最终为我的目的使用和工作的地方,这里是:

 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 \047" strftime(msg) "\047 mail@gmail.com </dev/null")
            # print msg | "cat>&2"
            print strftime(msg) | "tee -a \047/var/log/server_mon.txt\047 >&2"
            prev_state = curr_state
        }
    }
'