已经存在的解决方案每分钟刷一次整个日志文件并计算字符串出现的频率,使用日志行的时间戳仅计算前一分钟中的出现次数.
我认为用尾巴做这个会更有效率,所以我尝试了下面的测试:
filename="/var/log/file.log"tail -f $filename | awk -F,-v var="$HOSTname" ' BEGIN { Failed_count=0; } /account failure reason/ { Failed_count++; } END { printf("%saccount failure reason (Errors per Interval)=%d\n",var,Failed_count); }'
但这只是挂起而不输出任何东西.有人建议这个小改动:
filename="/var/log/file.log"awk -F,Failed_count); }' <(tail -f $filename)
但这也是一样的.
我正在使用的awk(我在上面的代码中进行了简化)可以工作,因为它在现有脚本中使用,其中grep“^ $TIMESTAMP”的结果通过管道输入.
我的问题是,如何让尾部-f与awk一起工作?
解决方法 假设您的日志看起来像这样:Jul 13 06:43:18 foo account failure reason: unkNown │ │ │ └── in awk └────── in awk
你可以这样做:
filename="/var/log/file.log"tail -F $filename | awk -v hostname="$HOSTname" ' NR == 1 { last= " " ; } " " != last { printf("%s account failure reason (Errors on %s)=%d\n",hostname,last,Failed); last= " " ; Failed=0; } /account failure reason/ { Failed++; }'
请注意,我已将其更改为tail -F(大写字母F),因为它处理日志老化.每个 *** 作系统都不支持此功能,但它应该适用于现代BSD和linuces.
这是如何运作的?
awk脚本包含一组test {命令;根据每行输入进行评估. (有两个特殊的测试,BEGIN和END,它们的命令分别在awk启动和awk结束时运行.在你的问题中,awk永远不会结束,所以END代码从未运行过.)
上面的脚本有三个测试/命令部分:
>在第一个中,NR == 1是仅在第一行输入上评估为真的测试.它运行的命令为最后一个变量创建初始值,在下一节中使用.
>在第二部分中,我们测试自从最后一行评估以来“last”变量是否已更改.如果这是真的,则表明我们正在评估新一天的数据.现在是时候打印上个月的摘要(日志),重置我们的变量并继续前进.
>在第三个中,如果我们评估的行匹配正则表达式/帐户失败原因/,我们递增计数器.
像泥一样清楚? 总结
以上是内存溢出为你收集整理的如何将尾部-f导入awk全部内容,希望文章能够帮你解决如何将尾部-f导入awk所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)