2行または3行をgrepする方法は、1行に必要なテキストが含まれており、他の行はそのすぐ下にありますか?


32

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

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


されcom.rabbitmq.client、次の行のテキストがbegginningから始まるか、その前にいくつかのスペースを持っていますか?
オイゲンコンコフ

回答:


62

ただ:

grep -A1 ERROR

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


そうそう、それも役に立つでしょう。
theTuxRacer

12
そして-C、マッチの前後の行を含みます(「C」は「コンテキスト」を意味します)。
マリウスゲドミナス

5

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

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

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

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

2
:Oそれは良い情報ですが、かなりやり過ぎです!それにもかかわらず、別の方法を知っているのは良いことです:)
theTuxRacer

これらのawkコマンドがどのように機能するかを理解してほしい。
ファイヤーフェザー

3
@Firefeather awk.freeshell.orgは、awkを学習するための優れたリソースです。GNU awkのマニュアルページもかなり良いです。
ガイラ

1

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

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

(\n(?=\s).*?)*意味するところ:

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.