web-dev-qa-db-ja.com

grepを介して入力を別のユーティリティにどのようにパイプしますか?

更新されたログファイルを追跡するために「tail-f」を使用しています。次に、その出力をgrepにパイプして、検索語(この場合は「org.springframework」)を含む行のみを表示します。最後に、grepからの出力を3番目のコマンド「cut」にパイプ処理します。

tail -f logfile | grep org.springframework | cut -c 25-

Cutコマンドは、各行の最初の25文字を削除しますgrepから入力を取得できる場合(チェーンから「grep」を削除すると、期待どおりに機能します。)

私はbashでcygwinを使用しています。

実際の結果: 'cut'コマンドに接続するために2番目のパイプを追加すると、入力が(まるでと思っていた場合)待機しているかのようにハングします。

27
les2

私のシステムでは、出力を取得する前に約8Kがバッファリングされました。このシーケンスは、ファイルをすぐに追跡するように機能しました。

tail -f logfile | while read line ; do echo "$line"| grep 'org.springframework'|cut -c 25- ; done
11

GNU grepと仮定して、コマンドラインに--line-bufferedを追加します。

tail -f logfile | grep --line-buffered org.springframework | cut -c 25-

編集:

ここでは、grepバッファリングだけが問題ではないようです。カットは行ごとのバッファリングを許可しないためです。

sedなどの制御可能なものに置き換えてみてください。

tail -f logfile | sed -u -n -e '/org\.springframework/ s/\(.\{0,25\}\).*$/\1/p'

またはawk

tail -f logfile | awk '/org\.springframework/ {print substr($0, 0, 25);fflush("")}'
29
Hasturkun