ライブストリームフィルタリング変更ログファイル

ライブストリームフィルタリング変更ログファイル

このサンプルがありますfile.log

11-Feb-2022 18:34:42 lorem uneeded5
11-Feb-2022 18:34:43 water uneeded6
11-Feb-2022 18:34:44 ipsum uneeded7
11-Feb-2022 18.34.45 waterfall uneeded8

私はfiltered.log このサンプルの結果を期待しています。

1644579283 water
1644579285 waterfall

基本的に私が望むフィルタは次のとおりです。

cut uneeded lines(私は努力したgrep

cut uneeded column(私は努力した cut

convert date string to timestamp(私は努力したdate

心配しないでください。私は切り取り、変換する方法を知っています。問題は、パイプやstdout、teeなどを使用して出力をストリーミングしてリダイレクトすることです。私はこれについて混乱しています。

これが私がしたことです。

tail -f file.log | grep --line-buffered "water" | tee temp.file | cut -d' ' -f1,2 | date +%s -f- | paste -d' ' - temp.file | cut -d' ' -f1,4 >> filtered.log

なぜ動作しないのですか?新しい行が渡されるとfile.log空白filtered.logのままになります。

理論的には、命令に対する私の脳の解釈は次のとおりです。

  • tail -fストリーミングまたは新しい回線を取得するために使用されます。
  • grep --line-buffered水を含むフィルターライン。
  • tee temp.file後で貼り付けられるように一時ファイルを作成します。
  • cut -f1,2後でタイムスタンプに変換するために列1と列2のみをインポートするdate
  • date前の出力のタイムスタンプ変換(出力切り取り)
  • paste以前にバックアップした最初の列temp.fileにタイムスタンプを貼り付けるかマージします。
  • cut不要な柱を切り取ってください。

これがバッファリングの問題のようですが、バッファの使い方がわかりません。試しましたが、stdbufまだ動作しません。

ベストアンサー1

解決しました!

以前の作業では、基本的にstdbuf各パイプのみが必要でした。なぜstdbufが必要なのかわかりません。

stdbuf -oL tail -f file.log | grep --line-buffered "water" | tee temp.file | stdbuf -oL -i0 cut -d' ' -f1,2 | stdbuf -oL -i0 date +%s -f- | stdbuf -oL -i0 paste -d' ' - temp.file | stdbuf -oL -i0 cut -d' ' -f1,4 >> filtered.log

おすすめ記事