用awk过滤最后100行的日志

时间:2019-01-02 13:42:36

标签: awk terminal grep command

我可以使用tail或grep过滤最后500行

tail --line 500 my_log | grep "ERROR"

使用awk的等效命令是什么

如何在下面的命令中添加行数

awk '/ERROR/' my_log

3 个答案:

答案 0 :(得分:2)

请您尝试以下。

tac Input_file | awk 'FNR<=100 && /error/' | tac

如果要在awk命令中添加行数,请尝试执行以下操作。

awk '/ERROR/{print FNR,$0}' Input_file

答案 1 :(得分:2)

由于您没有要测试的样本数据,因此我将使用seq 1 10仅显示数字。该记录存储最后n条记录,并最终打印出来:

$ seq 1 10 | 
  awk -v n=3 '{a[++c]=$0;delete a[c-n]}END{for(i=c-n+1;i<=c;i++)print a[i]}'
8
9
10

如果要过滤数据,请在/ERROR/之前添加{a[++c]=$0; ...

解释:

awk -v n=3 '{          # set wanted amount of records
    a[++c]=$0          # hash to a
    delete a[c-n]      # delete the ones outside of the window
}
END {                  # in the end
for(i=c-n+1;i<=c;i++)  # in order
    print a[i]         # output records
}'

答案 2 :(得分:2)

awk在更改读取文件之前不知道文件结尾,但是您可以两次读取文件,第一次找到结尾,第二次处理范围内的行。您也可以将X的最后一行保留在缓冲区中,但是这在内存消耗和处理上有点繁重。请注意,为此需要在文件末尾提及两次。

awk 'FNR==NR{L=NR-500;next};FNR>=L && /ERROR/{ print FNR":"$0}' my_log  my_log 

附有解释

awk '# first reading
     FNR==NR{
       #last line is this minus 500
       LL=NR-500
       # go to next line (for this file)
       next
       }

     # at second read (due to previous section filtering)
     # if line number is after(included) LL AND error is on the line content, print it
     FNR >= LL && /ERROR/ { print FNR ":" $0 }
     ' my_log  my_log 

关于gnu sed

sed '$-500,$ {/ERROR/ p}' my_log