Como grep 2 ou 3 linhas, uma contendo o texto que eu quero e as outras logo abaixo?

32

Este é um instantâneo do log de erros:

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message
com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:195)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:222)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:208)
    at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:139)
    at com.rabbitmq.client.impl.ChannelN.basicGet(ChannelN.java:645)

Eu faço o seguinte comando:

cat foo.log | grep ERROR para obter um OP como:

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message

Qual comando devo executar para obter a saída como

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message
    com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel

ou seja, também grep a (s) linha (s) após o padrão?

theTuxRacer
fonte
O com.rabbitmq.clienttexto na próxima linha começa no início ou tem alguns espaços à sua frente?
Eugen Konkov 11/11

Respostas:

62

Basta fazer um:

grep -A1 ERROR

O -A1comando grep deve incluir 1 linha após a partida. -Binclui linhas antes da partida, caso você precise disso também.

Jeremy Kerr
fonte
oh certo, isso seria útil também.
theTuxRacer
12
E -Cinclui linhas antes e depois da partida (o 'C' significa 'contexto', acredito).
Marius Gedminas
5

Para uma maneira mais portátil, há awk

awk '/ERROR/{n=NR+1} n>=NR' foo.log

Ou talvez você queira todas as linhas recuadas a seguir?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
Geirha
fonte
2
: O que é uma boa informação, mas um exagero! No entanto, é bom saber um método diferente :)
theTuxRacer
Eu gostaria de entender como esses awkcomandos funcionam.
Firefeather
3
@Firefeather awk.freeshell.org é um bom recurso para aprender o awk. A página de manual do GNU awk também é muito boa.
Geirha #
1

Eu encontrei esta solução:

cat apache.error.log | grep -Pzo '^.*?Exception In get Message.*?\ncom\.rabbitmq.*?(\n(?=\s).*?)*$'

Onde (\n(?=\s).*?)*significa:

  • \n encontre a próxima linha
  • (?=\s) onde é iniciado a partir do caractere de espaço em branco
  • .*? até o final da linha
  • (...)* Encontre essas linhas várias vezes

PS. Você pode definir esse padrão \ncom\.rabbitmq.*?se a segunda linha começar do espaço em branco\s

Eugen Konkov
fonte