日付/時刻に基づいてログファイルの最後の一意の行のみを印刷します。

日付/時刻に基づいてログファイルの最後の一意の行のみを印刷します。

次の形式のログファイルを使用しています。

Oct 12 01:28:26 server program: 192.168.1.105 text for 1.105 
Oct 12 01:30:00 server program: 192.168.1.104 text for 1.104 
Oct 12 01:30:23 server program: 192.168.1.103 text for 1.103
Oct 12 01:32:39 server program: 192.168.1.101 text for 1.101 
Oct 12 02:28:26 server program: 192.168.1.105 text for 1.105 
Oct 12 02:30:00 server program: 192.168.1.104 text for 1.104
Oct 12 02:30:23 server program: 192.168.1.103 text for 1.103 
Oct 12 02:32:39 server program: 192.168.1.101 text for 1.101 

私はこれを達成する必要があります:

Oct 12 02:28:26 server program: 192.168.1.105 text for 1.105 
Oct 12 02:30:00 server program: 192.168.1.104 text for 1.104
Oct 12 02:30:23 server program: 192.168.1.103 text for 1.103
Oct 12 02:32:39 server program: 192.168.1.101 text for 1.101

新しい出力をファイルに送信するには?私はこれを試しました:

awk '!_[$6]++ {a=$6} END{print a}' logfile

しかし、期待した結果は出ません。 awk または sed を使用して最後に最後に文字列の一致を見た一意の行のみを提供したり、日付/時刻に基づいて行うにはどうすればよいですか?

ベストアンサー1

2番目のパス(ほとんどが必要です)を実行する予定の場合は、レコード全体ではなく行番号のみを保存できます。ロジックをより簡単にします。

awk 'NR == FNR {if (z[$6]) y[z[$6]]; z[$6] = FNR; next} !(FNR in y)' logfile logfile

精度証明:

各行の処理が終了すると、これまでに処理された各行の数は次のようになります。誰でもzまたはのインデックス(値ではない)y(両方ではない)

z各反復が終了すると、値で表される行は、正確に各 IP アドレスについてこれまでに表示された最新のレコードです。

したがって、のインデックスはy正確に私たちが望む線です。いいえ印刷。

おすすめ記事