Фильтровать логи с помощью awk за последние 100 строк - PullRequest
0 голосов
/ 02 января 2019

Я могу отфильтровать последние 500 строк, используя tail или grep

tail --line 500 my_log | grep "ERROR"

Какая эквивалентная команда для использования awk

Как добавить строку в приведенной ниже команде

awk '/ERROR/' my_log

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Поскольку у вас не было образцов данных для тестирования, я покажу только цифры, используя 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
}'
0 голосов
/ 02 января 2019

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 

на гну сед

sed '$-500,$ {/ERROR/ p}' my_log
0 голосов
/ 02 января 2019

Не могли бы вы попробовать следующее.

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

Если вы хотите добавить количество строк в команду awk, попробуйте выполнить следующее.

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