grepからawkへのパイプは機能しません。

grepからawkへのパイプは機能しません。

grep連続tailファイルログを作成し、1n行から2番目の単語を取得しようとします。サンプルファイル:

$ cat > test.txt <<EOL
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
EOL
^C

今、私は次のようにしますtail

$ tail -f test.txt
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
^C

私がgrepこれを行うとtail

$ tail -f test.txt | grep Beam
Beam goes blah
Beam goes what?
Beam goes okay
Beam goes bye
^C

しかし、これawkを行うとgrep

$ tail -f test.txt | grep Beam | awk '{print $3}'

どんなに待っても何も起こりません。私はこれがストリームがどのように機能するかと関係があると思います。

誰に手がかりがありますか?

答え1

grepの出力バッファです。を使用して無効にできますgrep --line-buffered

しかし、grepの出力をawkにパイプする必要はありません。 awkは独自に正規表現パターンマッチングを実行できます。

tail -f test.txt | awk '/Beam/ {print $3}'

答え2

tail -f test.txt | awk '/Beam/{print $3}'私のために作品を使用してください。tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep)を使用してください。

ここでの問題は、awkデータを1行ずつ受け取るか、1つの大きな塊として受け取るかどうかです。 GNUバージョンのgrepはより効率的であるため、出力を大きな塊に送りますが、1行ずつ出力するには1行ずつ読み込む必要がありますawk

このように表現すると、grepデータはバッファがいっぱいになったときにのみ送信されます。 awkはそのバッファがいっぱいになるのを待つので、何も送信しません。

答え3

--line-bufferedオプションを参照してくださいgrep

関連情報