grepからawkへのパイピングが機能しない


34

ファイルログgrepの継続tailを試みて、n行からthワードを取得しようとしています。サンプルファイル:

$ 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}'

どんなに長く待っても何もありません。ストリームの仕組みに関係しているのではないかと思います。

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

回答:


56

おそらくgrepからの出力バッファリングです。で無効にできますgrep --line-buffered

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

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


8

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はより効率的であるため、より大きなブロックで出力を送信しますが、行単位で出力awkするには行単位で読み取る必要があります。

この言い方をすれば:grepそれは何も送出しないですので、バッファがいっぱいになったときにのみデータを送信する、awkは、充填すべきそのバッファを待っています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.