bash日志文件计数单词并用数字替换它们

时间:2017-11-21 18:35:05

标签: bash logging count grep

我需要从脚本日志中保留警告,并在每次启动后向每行添加“LAST”,以便我知道警报何时一目了然,所以我将其添加到我的脚本中: 这是我脚本的第一行:

echo "$( cat $ALERT_LOG_FILE | grep WARNING | tail -n 2k | ts "LAST ")" > $ALERT_LOG_FILE

脚本日志在首次运行时看起来像这样: WARNING : ... WARNING : ... WARNING : ... WARNING : ...

当脚本启动/重启时,回显线为每一行添加“LAST”并使其如下所示: LAST WARNING : ... LAST WARNING : ... LAST WARNING : ... LAST WARNING : ...

问题是一些重启后日志文件变成这样: LAST LAST LAST LAST WARNING : .... LAST LAST LAST WARNING : .... LAST LAST WARNING : .... LAST LAST WARNING : .... LAST WARNING : .... WARNING:

任何方式使它像这样: LAST 4 WARNING : .... LAST 3 WARNING : .... LAST 2 WARNING : .... LAST 2 WARNING : .... LAST 2 WARNING : .... LAST 1 WARNING : .... WARNING:

编辑:

使用@Yoda建议的

代码:

cat $LOG_FILE | grep WARNING | tail -n 2k  | ts "LAST " | awk '{n=gsub("LAST ",X);if(n) print "LAST",n,$0;else print}')" > $LOG_FILE
在使用@Yoda建议重新启动后

输出日志: LAST 2 2 1 WARNING : ... LAST 2 1 WARNING : ... LAST 1 WARNING : ... WARNING : ...

2 个答案:

答案 0 :(得分:0)

基于一些假设: -

$ awk '{n=gsub("LAST ",X);if(n) print "LAST",n,$0;else print}' file
LAST 4 WARNING : ....
LAST 3 WARNING : ....
LAST 2 WARNING : ....
LAST 2 WARNING : ....
LAST 1 WARNING : ....
WARNING:

如果这不是你想要的,那么我建议发布你的日志文件和预期输出的代表性样本。

答案 1 :(得分:0)

这可能有所帮助: -

awk '
        {
                n = gsub("LAST ",X)
                if( n )
                {
                        for ( i = 1; i <= NF; i++ )
                        {
                                if ( $i ~ /WARNING/ )
                                {
                                        sub(/^ */,X)
                                        print "LAST",n,$0;
                                        next
                                }
                                if ( $i ~ /^[0-9]$/ )
                                {
                                        n += $i
                                        $i = ""
                                }
                        }
                }
                else
                        print $0
        }
'