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

0

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

[algo-algo]

algumas coisas são caracteres e números necessários e variáveis. Meu arquivo de log especial inclui uma linha com caracteres explicados acima. ou seja,

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

Eu quero pegar a Linha 1 e a Linha 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 a minha linha especial até obter uma nova linha com número numérico: número numérico: número numérico, um ou mais números numéricos (isto é hora e um número de código de erro separado por vírgula)

(acho que procurando número, número: pode ser o suficiente)

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

Esta questão está relacionada com: esta questão

    
por kamaci 20.06.2012 / 14:08

1 resposta

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 MATCH será alterado:

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

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

  • Finalmente, se MATCH for verdadeiro, print $0 imprimirá toda a linha (denotada por $0 ).

    Como MATCH é verdadeiro se e somente se a última linha que começa com um registro de data e hora contiver o padrão [something-something] , isso produzirá a saída desejada.

por 20.06.2012 / 14:53