これはエラーログのスナップショットです。
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)
次のコマンドを実行します。
cat foo.log | grep ERROR
としてOPを取得するには:
06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message
出力を取得するにはどのコマンドを実行する必要がありますか
06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message
com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel
すなわち、パターンの後の行もgrepしますか?
ただ:
grep -A1 ERROR
-A1
は、一致の後に1行を含めるようにgrepに指示します。 -B
には、必要な場合に備えて、一致する前の行が含まれています。
よりポータブルな方法として、awkがあります
awk '/ERROR/{n=NR+1} n>=NR' foo.log
または、インデントされたすべての行をフォローしたいですか?
awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
私はこの解決策を見つけました:
cat Apache.error.log | grep -Pzo '^.*?Exception In get Message.*?\ncom\.rabbitmq.*?(\n(?=\s).*?)*$'
(\n(?=\s).*?)*
の意味:
\n
次の行を見つける(?=\s)
は空白文字から始まります.*?
行末まで(...)*
このような行を複数回検索しますPS。 2行目が空白\ncom\.rabbitmq.*?
で始まる場合、このパターンを\s
ターフできます。