圧縮されたログと圧縮されてないログの両方をgrepする

別にログに限った話ではないのだが、ログローテートで、直近のファイルは非圧縮で、少し前の世代から圧縮されているケースは多いと思う。

$ 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

望み通りの動作はしているが、もう少し簡潔な方法が無いかとも思う。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)