出力をフィルタリングしてリダイレクトする方法

出力をフィルタリングしてリダイレクトする方法

STDOUTで多くの出力を生成するコマンドがあり、次のようにそれをファイルにリダイレクトできることがわかります。

./myCMD 1>tmp

出力をファイルにリダイレクトする前にフィルタリングする方法たとえば、特定のキーワードを含む出力行のみをリダイレクトしたいとします。

答え1

tmp特定の行だけをファイルに入れ、残りを変更したくない場合:

cmd | awk '/pattern/ {print > "tmp"; next}
           {print}'

または:

cmd | sed '/pattern/!b
           w tmp
           d'

(一行cmd | sed -e '/pattern/!b' -e 'w tmp' -e d:)

または:

cmd | sed '/pattern/ {
             w tmp
             d
           }'

(一行cmd | sed -e '/pattern/{w tmp' -e 'd;}':)

sedについてpattern基本的な正規表現であるのに対し、についてはawk次のとおりです。拡大する正規表現。

答え2

パイプを使用してこれを行うことができます。

./myCMD | grep keyword > tmp

これにより、「キーワード」を含む行だけがファイルに書き込まれますtmp

出力全体を表示したいが、それらの一部だけをファイルに書き込むには、次のように追加しますtee(シェルがプロセス置換をサポートしていると仮定)。

./myCMD | tee >(grep keyword > tmp)

関連情報