毎秒追加されるデータを見ながらファイルを追加し、後で処理する新しいファイルにデータを転送しようとしています。使用
tail -f 'data file' >> 'destination file'
ところで数行が繰り返されてこうします。
tail -f 'data file' | awk '!seen[$0]++' | >> 'destination file'
大丈夫に見えますが、行は一定期間にわたって分割されるため、これを達成するには行全体をバッファリングする必要があるようです。しかし、これは良いアプローチですか、それとも別の方法で行う必要がありますか?
tail -f 'data file' | grep --line-buffered -E '^.*$' | awk '!seen[$0++]'
完全なデータの例
[9/10/17 14:21:09] Data=[xxx|yyy|zzz]
分割例
[9/1
[9/10/17 14:21:09] Data=[xx
このような。からデータを転送した後、tail
これが発生しますawk
。だから、grep
コマンドの最後まで行って動作しました。ただし、データが小さすぎると、データがバッファに残ります。
tail -f 'data file' | awk '!seen[$0++]' | grep --line-buffered -E '^.*$'
あなたのアドバイスと答えに感謝します!
答え1
しかし、いくつかの行が重複しています。
重複した項目が隣接する行の場合は、次のことを試すことができますuniq
。
$ tail -f <file> | uniq
クイックテストでは、出力を書き込む前に行全体を待って期待どおりに動作しました。
重複した行がファイル全体に散在している場合uniq
とパイプを間に追加すると、まだ役に立ちます。tail
awk