将时间戳附加到从 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
}
}
'
该脚本已将输出记录到一个名为“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
}
}
'