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
。