コマンドの出力をパイプし、grep で行をフィルタリングするだけでなく、ヘッダーである最初の行も保持したいとします。私は誰かがこれに似たものをタイプしているのを見ました:
the command | (read l; echo$l) | grep bla | less
最初の行(ヘッダー)を抽出し、ファイルの残りの行をgrepして、blaに一致する行を探し、その出力をless
検査しました。もちろん、上記のコマンドは機能しませんが、それがアイデアです。どの部分が間違っていますか?
コマンドの出力をパイプし、grep で行をフィルタリングするだけでなく、ヘッダーである最初の行も保持したいとします。私は誰かがこれに似たものをタイプしているのを見ました:
the command | (read l; echo$l) | grep bla | less
最初の行(ヘッダー)を抽出し、ファイルの残りの行をgrepして、blaに一致する行を探し、その出力をless
検査しました。もちろん、上記のコマンドは機能しませんが、それがアイデアです。どの部分が間違っていますか?
awk を使用:
command | awk 'NR==1||/bla/'
{print}
デフォルトのアクションであるため、これは不要であると指摘してくれた @doubleDown に感謝します。
パールの場合:
command | perl -ne 'print if $.==1 or /bla/'
(Perl の不規則な表現が必要な場合は、おそらく perl が利用可能です:))
sed
フレーバー:
command | sed -ne '1p' -ne '/bla/p'
上記のawk
およびsed
回答は通常、進むべき道です。問題の正規表現が複雑でgrep
唯一のオプションである場合は、次の -tee
ベースのオプションが機能するはずです。ここでtee
は、その入力を 2 つの「ファイル」に書き込みます。ここで、grep
とhead
は、プロセス置換を介して入力を消費します。tee
また、入力を標準出力に書き込みます。この場合、標準出力を にリダイレクトする必要があります/dev/null
。は、前にその出力sleep
を確実head
に返すために必要ですgrep
command | tee >(sleep 1; grep regex) >(head -1) >/dev/null