grep -A
作品あなたのgrepがそれをサポートしている場合(それがPOSIX grepではありません)。
次ん
bpeek | sed '/nPDE/!d;N'
::これは、このファイルの
nPDE
nPDE
context line
を右出力を印刷するために失敗すること
/nPDE/!d # If the line doesn't match "nPDE", delete it (starts new cycle)
N # Else, append next line and print them both
注目して、それがない場合は、sedのを使用することができますGNU sedをお持ちの場合は、次のようにアドレス範囲を使用できます。
sed '/nPDE/,+1!d'
フォーマット
addr1,+N
のの
アドレスは(我々の場合/nPDE/
に)addr1
、以下N
線間の範囲を定義します。このソリューションは、異なる数のコンテキストラインに適応するのが簡単ですが、上記の例では失敗します。
/nPDE/ { # If the line matches "nPDE"
$p # If we're on the last line, just print it
:a # Label to jump to
N # Append next line to pattern space
/\n[^\n]*nPDE[^\n]*$/! { # If appended line does not contain "nPDE"
p # Print pattern space
b # Branch to end (start new loop)
}
ba # Branch to label (appended line contained "nPDE")
}
を他のすべての行が原因-n
オプションで印刷されていません。
blah
nPDE
context
blah
blah
nPDE
nPDE
context
nPDE
ようなケースを管理
ソリューションは、以下を実行すること
よう
sed -n '/nPDE/{$p;:a;N;/\n[^\n]*nPDE[^\n]*$/!{p;b};ba}'
をしたいと思います。
Edのコメントで指摘されているように、これは読めるものではなく、大量のコンテキスト行にも拡張されませんが、1つのコンテキスト行に対して正しく機能します。 AWKで
WRTを - '私の知る限りawkは唯一files'を読むことができます。まったくではなく、 'grep' canと同様にパイプから読み込むことができ、サブプロセスやコプロセスからも読み込むことができます。 –