5

コマンドの出力をパイプし、grep で行をフィルタリングするだけでなく、ヘッダーである最初の行も保持したいとします。私は誰かがこれに似たものをタイプしているのを見ました:

the command | (read l; echo$l) | grep bla | less

最初の行(ヘッダー)を抽出し、ファイルの残りの行をgrepして、blaに一致する行を探し、その出力をless検査しました。もちろん、上記のコマンドは機能しませんが、それがアイデアです。どの部分が間違っていますか?

4

4 に答える 4

6

awk を使用:

command | awk 'NR==1||/bla/'

{print}デフォルトのアクションであるため、これは不要であると指摘してくれた @doubleDown に感謝します。

パールの場合:

command | perl -ne 'print if $.==1 or /bla/'

(Perl の不規則な表現が必要な場合は、おそらく perl が利用可能です:))

于 2013-06-14T17:16:12.667 に答える
2

sedフレーバー:

command | sed -ne '1p' -ne '/bla/p'
于 2013-06-14T18:01:10.213 に答える
0

上記のawkおよびsed回答は通常、進むべき道です。問題の正規表現が複雑でgrep唯一のオプションである場合は、次の -teeベースのオプションが機能するはずです。ここでteeは、その入力を 2 つの「ファイル」に書き込みます。ここで、grepheadは、プロセス置換を介して入力を消費します。teeまた、入力を標準出力に書き込みます。この場合、標準出力を にリダイレクトする必要があります/dev/null。は、前にその出力sleepを確実headに返すために必要ですgrep

command | tee  >(sleep 1; grep regex) >(head -1) >/dev/null
于 2013-06-14T18:21:40.527 に答える