/var/log/ の syslog と syslog.1 と syslog.2.gz を一気通貫でgrepする


背景

syslogを検索するとき、過去のログも含めて一気に表示したりgrepしたりしたいですよね。

cat /var/log/syslog* | grep KEYWORD
zcat /var/log/syslog* | grep KEYWORD

このやり方には、次の問題があります。

問題点

  • 出力される結果が時系列順のログになっていない
  • catコマンドを使った場合は、syslog.2.gz を検索できていない
  • zcatコマンドを使った場合は、syslog や syslog.1 を検索できていない
    • gzip: /var/log/syslog: not in gzip formatエラーが表示される
      % zcat /var/log/syslog* | grep KEYWORD
      gzip: /var/log/syslog: not in gzip format
      gzip: /var/log/syslog.1: not in gzip format
      

結論

次のコマンドで検索します。

ls -r /var/log/syslog* | xargs zcat -f -- | grep KEYWORD

解説

まず、syslogファイル名を逆順で出力します。

# コマンド
ls -r /var/log/syslog*

# 結果
/var/log/syslog.3.gz
/var/log/syslog.2.gz
/var/log/syslog.1
/var/log/syslog

次に、lsで出力されたファイル名一覧をzcatの引数に与えます。
zcat-f オプションによって、引数のファイルがgzipファイルでなかった場合には何もせずに標準出力に流すようにします。
zcat-- はオプションとファイル名の境界を指示する意味合いがあります。もしファイル名が-syslog などとハイフンから始まる場合でも、確実にファイル名として認識させるようにします。
今回の場合はlsの結果として-syslog というファイル名は与えられませんので、あまり意味はありませんが…。

# コマンド
xargs zcat -f --

# 実行されるコマンドのイメージ
zcat -f -- /var/log/syslog.3.gz /var/log/syslog.2.gz /var/log/syslog.1 /var/log/syslog

このやりかたで、syslogを検索するとき、過去のログも含めて一気に表示したりgrepすることができます。

別コマンド

同じ意味ですが、次のようなコマンドでもOKです。
xargsがよくわからんというひとには、こちらがわかりやすいかもしれませんね。

zcat -f -- `ls -r /var/log/syslog*` | grep KEYWORD