grep apenas para linhas de processo que causaram o erro

3

Existe um serviço sendo executado como vários processos e os logs de todos vêm para um log enorme (não me pergunte por quê). Parece assim:

process1: bla bla bla
process2: ha ha ha
process3: tarara **error_has_happened**
process3: details of the error here
process1: bla bla bla
process3: more details of the error here
process2: ha ha ha

O erro pode acontecer em qualquer um dos processos, então eu quero que meus greps encontrem isso para todos os processos:

process3: tarara **error_has_happened**
process3: details of the error here
process3: more details of the error here

Então, basicamente, detectar o error_has_happened e o processo em que isso aconteceu e imprimir as próximas N linhas apenas desse processo. Isso deve acontecer para todos os processos que tiveram este erro, assumindo que os logs de detalhes do erro de diferentes processos não são intercalados

É possível fazer isso usando grep sozinho? como?

    
por fersarr 12.01.2017 / 13:47

2 respostas

3

Você pode fazer isso com:

grep "error_has_happened" -A3 logfile.log

Onde 3, é o número de linhas após a ocorrência error_has_happened que será mostrada. No entanto, isso também mostrará outras saídas do processo, não apenas as saídas do processo que envia o erro.

Um comando mais elaborado que funcionou para mim em um teste rápido é:

grep "error_has_happened" logfile.log | cut -d : -f1 | sort -u |
  while IFS= read -r process; do
    grep "^$process:" logfile.log |
      grep -A3 "error_has_happened"
  done
    
por 12.01.2017 / 13:49
2

Com awk , para imprimir a linha de erro e as 10 linhas desse processo depois:

awk -F : -v N=10 '/error_has_happened/ {n[$1] = N+1}
                  n[$1]-- > 0' logfile.log
    
por 12.01.2017 / 13:56