Shammer's Philosophy

My private adversaria

一行の前方一部分を削除する--NRとは?

ログの解析などをしていて、大量のログの中から同じメッセージは何回出てくるか、というのを調べたい時がある。重複の排除はuniqでできるが、ログの場合はタイムスタンプが異なるのでuniqのみでは絞り込みに難がある。そこで、ログのタイムスタンプ部分だけを削除し、その後でuniqを使う、というアプローチが必要になる。
ログのタイムスタンプ部分だけを削除する方法も何通りかあると思われるが、今回はawkを使う。普通はcutやsedが多いのだろうか。。。ログフォーマットが以下のような場合、

Aug 12 2014 12:00:00 Info hogehoge

最初の5カラム分を削除したいことになる。しかし、awk '{print $6}' だと、hogehogeの内容によっては全部のログが出ない。hogehoge fugafugaとなっている場合は、print $6 " " $7 というようにしないといけない。しかし、この部分は不定なので延々と記述するわけにいかないのが実情だ。何ブロックまであるのか、という情報が必要になる。

この一行のブロック数は変数(?)のNRで参照できる。以下のようにすればメッセージの内容がどんなものであってもタイムスタンプなしで絞り込みができる。

awk ‘{for(i=6;i<=NF;i++){printf "%s ", $i}print ""}‘ log.txt | sort -u