別にログに限った話ではないのだが、ログローテートで、直近のファイルは非圧縮で、少し前の世代から圧縮されているケースは多いと思う。
$ ls -ltr syslog* -rw-r----- 1 syslog adm 50488 12月 17 00:00 syslog.7.gz -rw-r----- 1 syslog adm 22049 12月 18 00:00 syslog.6.gz -rw-r----- 1 syslog adm 27255 12月 19 00:00 syslog.5.gz
-rw-r----- 1 syslog adm 23651 12月 20 00:00 syslog.4.gz
-rw-r----- 1 syslog adm 16370 12月 21 00:00 syslog.3.gz -rw-r----- 1 syslog adm 17175 12月 22 00:00 syslog.2.gz -rw-r----- 1 syslog adm 282433 12月 23 00:00 syslog.1
-rw-r----- 1 syslog adm 206387 12月 23 11:10 syslog
こんなとき
圧縮されてないときは、乱暴に全部catしてgrepすればいいと思う。
$ cat syslog*|grep PATTERN
ただ圧縮ファイルと通常ファイルが混在していると当然うまくいかない。
こんなときは、複数のコマンドをカッコ()でまとめてあげればいい。
$ ( zcat syslog.3.gz syslog.2.gz ; cat syslog.1 syslog ) | grep PATTERN
こんな感じ。圧縮ファイル用のzcatと通常ファイルのcatのコマンドをカッコでまとめている。
ファイルをもっとまとめて処理したいなら以下などだろうか。
$ ( ls -1tr syslog*.gz | xargs zcat ; cat syslog.1 syslog ) | grep PATTERN
望み通りの動作はしているが、もう少し簡潔な方法が無いかとも思う。