bash - 将时间戳附加到从 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 的每个日志条目相关联的时间戳。
谢谢
解决方案
我强烈建议您只阅读和打印日志文件中已经存在的时间戳,但如果这不是某些 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部分来演示如何编写代码生成时间戳并将其保存在变量中。
推荐阅读
- html - 悬停/鼠标悬停html时将视频源更改为图像源
- latex - 如何在 TikZ/er 图片中省略关系的“钻石”符号并控制文本沿关系路径的位置?
- r - R tidymodels 配方接近数字属性的零方差过滤器
- c# - C# 检查列表
为空 - stripe-payments - 如果帐户经过验证,您将无法通过 API 更改 `company[tax_id]`。条纹
- javascript - 在我的代码中需要 mongodb api mongoose 后,Visual Studio 代码中的错误
- optimization - Solidity gas 费用的最佳内存实践和优化
- mysql - Sequelize N:M ParentModel.setChilds(ChildArray) 不是函数(魔术方法?)
- c++ - std::cin 函数未按预期运行?
- pascal - Turbo Pascal 中的左右语句是否有对齐字符串?