grep regexに応じて出力をリダイレクトする


8

gradle runRESTサーバーの起動に使用しています。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アドレスです。ランダムテキストはエラーメッセージです。悲しいことに、すべての出力はstdoutに送られます。

IPアドレスで始まるすべての行を、呼び出されたファイルに転送し、err.log他のすべての行に転送するにはどうすればよいall.logですか

残念ながら、gradle runこれはRESTサーバーであるため、1回しか起動できず、停止しません。

多分teegrep組み合わせを使用しますか?

回答:


8

Bashでは、teeでプロセス置換を使用できます。

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

これによりerr.log、XXXに一致するすべての行がに、すべての行がに配置されall.logます。>( ... )括弧内にプロセスを作成し、その標準出力をパイプに接続します。これはzshや他の最新のシェルでも機能します。

moreutilspeeからコマンドを使用することもできます。

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が、それでも問題ありません)。


Hmm err.logは空で、すべての出力は上記all.logteeコマンドを使用してリダイレクトされます。
polym 2014

正規表現が実際に正しい行と一致していることを確認します。err.log存在する場合、コマンドは実行されましたが何も出力されませんでした。grep -Eawkコマンドで使用される式と一致する必要があります。
Michael Homer

ああ、わかった。質問を変更して、all.logして、grep式の一致した行が含まれないか?
polym 2014

完了—どちらが欲しいかわからなかったので、両方を用意しました。
Michael Homer

ああすみません、うまくいきました。上書きしたall.logerr.log古いコマンドでしました。混乱させて申し訳ありません。ありがとう、あなたは素晴らしいです:))!!
polym 2014

4

だから、それはのように見えるgradle runに準拠していないteepeegrepおよびIO-リダイレクト。4096バイトを超えると、常に読み取りを停止します。

この問題を回避するために、のread各行gradle run。私はまだテストしていませんが、4k文字を超える行の読み取りも失敗すると思います。

とにかく、ここに私の質問を具体的に解決するためのコードがあります:

#!/bin/bash
STDOUTLOG="/log/stdout.txt"
STDERRLOG="/log/stderr.txt"
while read -r line; do
    [[ $line =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.* ]] && printf '%s\n' "$line" >> "$STDERRLOG" && continue
    printf '%s\n' "$line" >> "$STDOUTLOG"
done < <(gradle run)

1
を使用read -r lineprintf '%s\n' "$line"て、一部のエッジ ケースで問題が発生しないようにする必要があります。
nyuszika7h 2014

@ nyuszika7hありがとうございます!私はそれに応じて答えを変更しました:)。
polym 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.