行内で1回繰り返される行のみを表示し、その行が何回繰り返されたかを示す数字を表示するようにログファイルを整理するにはどうすればよいですか?

行内で1回繰り返される行のみを表示し、その行が何回繰り返されたかを示す数字を表示するようにログファイルを整理するにはどうすればよいですか?

現在のログ:

18:56:54 Info: Starting
18:56:55 Error: timed out
18:56:56 Error: timed out
18:56:57 Error: timed out
18:56:58 Info: reconnected
18:56:59 Error: timed out

希望の出力:

18:56:54 Info: Starting
18:56:55 Error: timed out (3)
18:56:57 Info: reconnected
18:56:58 Error: timed out

私のログファイルには何千もの重複した行があり、bash / linuxコマンドを使用してChromeログの動作を複製したいと思います。

私はこれをかなり近いと見つけました。 部分的に重複した連続行を削除しますが、最初の行と最後の行は保持します。

この魔法の awk コマンドを提供します。

awk '{n=$2$3$4$5$6$7}l1!=n{if(p)print l0; print; p=0}l1==n{p=1}{l0=$0; l1=n}END{print}' file

(重要なのは、n = $ 1を除くとタイムスタンプが異なる場合があります。これは必須です。圧縮された行の正確なタイムスタンプは重要ではないとマークされます。)

ただし、カウンタも追加する必要があり、削除された内容を正確に知ることができるので、読みやすさと正確さの間で正しい妥協点を見つけることができます。失われる唯一の情報は、重複メッセージに最初または最後のタイムスタンプがある正確な時間です。

ありがとうございます。私はawkに堪能ではなく、ちょうどuniqについて学びました。誰かが私を解決策につなげるか、これを楽しい練習として見ることができることを願っています。乾杯。

ベストアンサー1

必要ありませんawk。ただ直接使用してくださいuniq

uniq -c -f 1 file

この-cオプションは、入力で行が連続して見つかった回数を提供し、最初のスペースまたはタブをスキップしてフィールドのタイムスタンプを区切ることができます-f 1

質問のデータの例を見てください。

$ uniq -c -f 1 file
   1 18:56:54 Info: Starting
   3 18:56:55 Error: timed out
   1 18:56:58 Info: reconnected
   1 18:56:59 Error: timed out

おすすめ記事