Apenas faça um:
grep -A1 ERROR
O -A1
diz ao grep para incluir 1 linha após a partida. -B
inclui linhas antes da partida, caso você precise disso também.
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
ie, também grep a (s) linha (s) após o padrão?
Apenas faça um:
grep -A1 ERROR
O -A1
diz ao grep para incluir 1 linha após a partida. -B
inclui linhas antes da partida, caso você precise disso também.
Para uma maneira mais portável, há o awk
awk '/ERROR/{n=NR+1} n>=NR' foo.log
Ou talvez você deseje seguir todas as linhas recuadas?
awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
Eu encontrei esta solução:
cat apache.error.log | grep -Pzo '^.*?Exception In get Message.*?\ncom\.rabbitmq.*?(\n(?=\s).*?)*$'
Onde (\n(?=\s).*?)*
significa:
\n
encontra 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 criar este padrão \ncom\.rabbitmq.*?
se a segunda linha começar do espaço em branco \s
Tags command-line bash grep