web-dev-qa-db-ja.com

2行または3行をグレップするにはどうすればいいですか?

これはエラーログのスナップショットです。

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しますか?

30
theTuxRacer

ただ:

grep -A1 ERROR

-A1は、一致の後に1行を含めるようにgrepに指示します。 -Bには、必要な場合に備えて、一致する前の行が含まれています。

59
Jeremy Kerr

よりポータブルな方法として、awkがあります

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

または、インデントされたすべての行をフォローしたいですか?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
5
geirha

私はこの解決策を見つけました:

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

(\n(?=\s).*?)*の意味:

  • \n次の行を見つける
  • (?=\s)は空白文字から始まります
  • .*?行末まで
  • (...)*このような行を複数回検索します

PS。 2行目が空白\ncom\.rabbitmq.*?で始まる場合、このパターンを\sターフできます。

1
Eugen Konkov