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