grep正規表現に基づく出力リダイレクト

grep正規表現に基づく出力リダイレクト

RESTサーバーを起動するために使用しますgradle run。 RESTサーバーの出力は次のとおりです。

XXX.XXX.XX.XXX - <moreinfo>
randomtext
randomtext
XXX.XXX.XX.XXX - <moreinfo>
XXX.XXX.XX.XXX - <moreinfo>
randomtext
XXX.XXX.XX.XXX - <moreinfo>

XXX.XXX.XX.XXXこれはIPアドレスで、ランダムなテキストはエラーメッセージです。残念ながら、すべての出力は標準出力として指定されます。

IPアドレスで始まるすべての行をファイル名err.logと他のすべての行にどのように指定できますかall.log

残念ながらgradle runRESTサーバーなので、一度だけ起動して停止することはできません。

たぶん組み合わせteeを使用しますかgrep

ベストアンサー1

Bashでは、次のものを使用できます。プロセスの交換Tシャツ付き:

tee >(grep XXX > err.log) | grep -v XXX > all.log

これにより、XXXに一致するすべての行が入力され、err.logすべての行がall.log>( ... )括弧内にプロセスを作成し、標準出力をパイプに接続します。これは以下に適用されます。他の現代の殻があります。

pee次のコマンドを使用することもできます。その他のユーティリティ:

pee "grep XXX > err.log" "grep -v XXX > all.log"

pee標準入力を複数のコマンド(「パイプティ」)にリダイレクトします。

別のオプションはawkを使用することです。

awk '{ if (/^([0-9]{1,3}\.){3}[0-9]{1,3}/) { print > "err.log" } else { print > "all.log" } }'

これは、式に対して各行をテストし、一致するかどうかerr.logにかかわらず、内容全体を作成しますall.log

awk正規表現も適していますgrep -E(いくつかの間違ったアドレスと一致しますが(999.0.0.0など))、おそらく問題にはなりません。

おすすめ記事