このサンプルがあります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