代码之家  ›  专栏  ›  技术社区  ›  Shihabudheen K M

使用awk筛选最后100行的日志

  •  0
  • Shihabudheen K M  · 技术社区  · 7 年前

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

    tail --line 500 my_log | grep "ERROR"
    

    awk '/ERROR/' my_log
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   James Brown    7 年前

    由于您没有要测试的样本数据,我将使用 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
  •   RavinderSingh13 Nikita Bakshi    7 年前

    你能试试下面的吗。

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

    如果要在中添加行数 awk

    awk '/ERROR/{print FNR,$0}' Input_file
    
        3
  •  2
  •   NeronLeVelu    7 年前

    直到读取文件的方式发生变化,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