コマンドの出力をパイプし、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