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 run
RESTサーバーなので、一度だけ起動して停止することはできません。
たぶん組み合わせ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
など))、おそらく問題にはなりません。