加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

如何将尾部-f导入awk

发布时间:2020-12-30 15:50:13 所属栏目:Linux 来源:网络整理
导读:我正在尝试设置一个脚本,当某个字符串出现在日志文件中时会生成警报. 已经存在的解决方案每分钟刷一次整个日志文件并计算字符串出现的频率,使用日志行的时间戳仅计算前一分钟中的出现次数. 我认为用尾巴做这个会更有效率,所以我尝试了下面的测试: FILENAM

我正在尝试设置一个脚本,当某个字符串出现在日志文件中时会生成警报.

已经存在的解决方案每分钟刷一次整个日志文件并计算字符串出现的频率,使用日志行的时间戳仅计算前一分钟中的出现次数.

我认为用尾巴做这个会更有效率,所以我尝试了下面的测试:

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)=%dn",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
 │   │    
 │   └── $2 in awk
 └────── $1 in awk

你可以这样做:

FILENAME="/var/log/file.log"

tail -F $FILENAME | awk -v hostname="$HOSTNAME" '
    NR == 1 {
        last=$1 " " $2;
    }
    $1 " " $2 != last {
        printf("%s account failure reason (Errors on %s)=%dn",hostname,last,failed);
        last=$1 " " $2;
        failed=0;
    }
    /account failure reason/ {
        failed++;
    }
'

请注意,我已将其更改为tail -F(大写字母F),因为它处理日志老化.每个操作系统都不支持此功能,但它应该适用于现代BSD和Linuces.

这是如何运作的?

awk脚本包含一组test {命令;根据每行输入进行评估. (有两个特殊的测试,BEGIN和END,它们的命令分别在awk启动和awk结束时运行.在你的问题中,awk永远不会结束,所以END代码从未运行过.)

上面的脚本有三个测试/命令部分:

>在第一个中,NR == 1是仅在第一行输入上评估为真的测试.它运行的命令为最后一个变量创建初始值,在下一节中使用.
>在第二部分中,我们测试自从最后一行评估以来“last”变量是否已更改.如果这是真的,则表明我们正在评估新一天的数据.现在是时候打印上个月的摘要(日志),重置我们的变量并继续前进.
>在第三个中,如果我们评估的行匹配正则表达式/帐户失败原因/,我们递增计数器.

像泥一样清楚?

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!