Mostrar começando com uma linha especial até uma linha especial regex para o comando tail do Linux

0

Eu uso essa notação nos meus arquivos de log:

[alguma coisa alguma coisa]

algumas coisas são necessárias e caracteres e números de comprimento variável. Meu arquivo de log especial inclui uma linha com os caracteres explicados acima. ie

Line 1: 14:40:45,107 DEBUG [AS-kmksdf] Error occured!
Line 2: something somethingg..
Line 3: 14:40:45,108 DEBUG Some other errors

Quero obter as linhas 1 e 2 (porque o erro continua na linha 2). Meus arquivos de log crescem dinamicamente e eu mostro na minha tela com:

tail -f log.txt

Como posso mostrar as linhas que começam com minha linha especial até obter uma nova linha com o número número: número número: número número, um ou mais números de comprimento (este é o número do código de erro separado por hora e vírgula)

(Acho que procurar número, número: pode ser o suficiente)

Eu uso o cygwin com o windows7 e posso executar alguns comandos linux no meu cmd.exe.

Esta questão foi redigida em: esta questão

kamaci
fonte

Respostas:

1

Comando

tail -f log.txt | awk '{if($1~/[0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9]+/){if($0~/\[[A-Za-z]+-[A-Za-z]+\]/){MATCH=1}else{MATCH=0}}if(MATCH){print $0}}'

Como funciona

  • awk processa a saída canalizada linha por linha.

  • Se o primeiro campo da linha (delimitado por espaço e indicado por $1) corresponder à expressão regular [0-9][0-9]:[0-9][0-9]:[0-9][0-9],[0-9]+, o valor de MATCHserá alterado:

    • Se o padrão \[[A-Za-z]+-[A-Za-z]+\]ocorrer, MATCHserá definido como 1(verdade).

    • Se o padrão \[[A-Za-z]+-[A-Za-z]+\]não ocorrer, MATCHserá definido como 0(falso).

  • Finalmente, se MATCHfor verdade, print $0imprime a linha inteira (indicada por $0).

    Como MATCHé verdade se, e somente se, a última linha que começa com um carimbo de hora continha o padrão [something-something], isso produz a saída desejada.

Dennis
fonte