Saltar um arquivo para um texto específico

4

Existe um comando Linux semelhante ao tail, em vez de especificar um número de linhas que você pode especificar uma string de texto, o arquivo seria procurado para o texto da última linha para o primeiro e, em seguida, exibir todos ou um número especificado linhas depois disso? O conteúdo no final do log que estou tentando capturar pode variar entre 0 e 10 linhas, então, quando não é 10, o arquivo de log que copio é difícil de entender.

A partir da página de acompanhamento, estou vendo apenas a capacidade de especificar linhas ou bytes.

    
por JohnSmith 13.07.2016 / 16:17

5 respostas

4

specify a string of text and then display all lines after that

Veja alguns dados falsos para brincar:

$ seq 100 > input

... e aqui estou procurando pela string "90" e exibindo tudo depois dela (até o $ final do arquivo):

$ sed -n '/90/,$p' input
90
91
92
93
94
95
96
97
98
99
100

Se você quiser uma solução mais flexível, use uma variável, altere as citações de assinatura (e escape do $ do shell, para sed):

$ t=96
$ sed -n "/$t/,\$p" input
# or
$ sed -n /$t/,\$p input
96
97
98
99
100
    
por 13.07.2016 / 17:06
4

Você pode usar este comando retail : link

Ele suporta expressões regulares para iniciar e parar a saída, então você provavelmente quer algo como:

retail -r STARTPATTERN mylogfile
retail -r STARTPATTERN -u ENDPATTERN -f mylogfile

A opção -r encontra explicitamente a última instância do padrão, que geralmente é o que você deseja.

Veja também: link

Aqui está um exemplo usando um log de erros do Apache onde o Apache foi reiniciado várias vezes, usando retail para extrair apenas a reinicialização final:

$ grep -c "Apache.*resuming normal operations" /var/web/logs/error.log
8 
$ retail -r  "Apache.*resuming normal operations" /var/web/logs/error.log
[Wed Jul  6 17:12:55.534567 2016] [mpm_prefork:notice] [pid 17965] AH00163: Apache/2.4.4 (Unix) OpenSSL/1.0.1e configured -- resuming normal operations
[Wed Jul  6 17:12:55.534582 2016] [mpm_prefork:info] [pid 17965] AH00164: Server built: Mar 26 2016 12:22:17
[Wed Jul  6 17:12:55.534598 2016] [core:notice] [pid 17965] AH00094: Command line: '/usr/local/apache2/bin/httpd'

Ou você pode usar uma regex de "(SIGTERM.* shutting down|SIGHUP.*restart)" para mostrar tudo após a última tentativa de desligamento ou reinicialização.

    
por 13.07.2016 / 16:43
2

Se o seu grep tiver o sinal -A para exibir um determinado número de linhas de contexto após cada correspondência, você poderá fazer o seguinte:

grep -A 10 'pattern' logfile | less
    
por 13.07.2016 / 17:00
2

O editor ed tem a capacidade de pesquisar para trás por uma ocorrência precedente de uma expressão regular - e convenientemente define seu endereço atual para a última linha do arquivo na abertura. Então você poderia fazer

ed file
?string?,.p
q

para as linhas de saída da última ocorrência de string até o final do arquivo (inclusive) - ou, como uma linha direta

printf '?string?,.p\nq' | ed -s file
    
por 13.07.2016 / 16:27
2

Apenas para completar, eu vou colocar uma solução usando awk - enquanto você não precisa dela para esta tarefa específica, é uma ferramenta muito poderosa e esse é o tipo de problema que é bom para resolver.

awk '/pattern/{x=1}x{print}'

Isso define a variável x quando o padrão é encontrado e imprime uma linha sempre que x for verdadeiro. Note que isso começa na primeira ocorrência do padrão.

    
por 13.07.2016 / 20:22

Tags