2017-05-11 12 views
0

コマンドの出力をフィルタリングする必要があります。 私はこれを試しました。最初のパターン行とそれに続く行だけを出力する

bpeek | grep nPDE 

私の問題は、私が見つけたファイルの後nPDEのすべての一致とラインを必要とすることです。出力は次のようになります。

iteration nPDE 
1   1 
iteration nPDE 
2   4 

最良の場合は、見つかった行が1回だけ表示され、その後は1行だけ表示される場合です。

私はawkで解決策を見つけましたが、私が知っている限りawkはファイルを読むことしかできません。

+2

WRTを - '私の知る限りawkは唯一files'を読むことができます。まったくではなく、 'grep' canと同様にパイプから読み込むことができ、サブプロセスやコプロセスからも読み込むことができます。 –

答えて

2

オプションがあります。したがって

grep --help 
... 
    -A, --after-context=NUM print NUM lines of trailing context 

bpeek | grep -A 1 'nPDE' 
0

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で

+0

これはgrepやawkの解決法と同じセマンティクスを持っていません。 'nPDE'が2つの連続した行に出現すると、それらの2行は出力されますが、2行目の' nPDE'行の後に行は印刷されません。 grepとawkのソリューションは3行全てを出力します。ちょうどスティーン '.... –

+0

@エドモートン良い点!それを見てみましょう。 –

+0

IMHOこれは本当にあなたがとにかくsedを使う仕事ではないので心配する価値はありません。 'sed '/ nPDE /!d; N; N; N; N; N; N .....'とタイプすると '' nPDE'の後に10行印字するように変更されたことを想像してみてください。 grepまたはawkソリューションの番号を変更します。 –

1

(完全性についてあなたはgrepをとsedの解決策があるため):

awk '/nPDE/{c=2} c&&c--' 
関連する問題