ソフトウェア/catlog

(135d) 更新

公開メモ

gzip されたログファイルをシームレスに読むコマンド

/var/log にあるログ、最新版はテキストだけれど古いものは gzip されているので、 自動的に gunzip して古いものから新しいものへつなげて表示するコマンドを作った。

/bin/catlog

LANG:bash
#!/bin/bash
gunzip -c `ls -r -t /var/log/$1* | grep -E "\.gz$"` | cat - `ls -r -t /var/log/$1* | grep -E "\.gz$" -v`

ls に -t を付けると時刻順、-r を付けると古いもの順になる

引数 $1 として例えば dpkg.log が与えられれば普通は名前順で

dpkg.log
dpkg.log.1
dpkg.log.10.gz
dpkg.log.11.gz
dpkg.log.12.gz
dpkg.log.2.gz
dpkg.log.3.gz
dpkg.log.4.gz
dpkg.log.5.gz
dpkg.log.6.gz
dpkg.log.7.gz
dpkg.log.8.gz
dpkg.log.9.gz

の順になるところ、

dpkg.log.12.gz
dpkg.log.11.gz
dpkg.log.10.gz
dpkg.log.9.gz
dpkg.log.8.gz
dpkg.log.7.gz
dpkg.log.6.gz
dpkg.log.5.gz
dpkg.log.4.gz
dpkg.log.3.gz
dpkg.log.2.gz
dpkg.log.1
dpkg.log

となってくれる。

このリストに grep -E "\.gz$" することで末尾が .gz となっているものをより分けて、 gunzip に渡し、-c でコンソールへ出力する

一方、同じリストを grep -v -E "\.gz$" することで、「末尾が .gz となっていないもの」をより分けて cat に渡す。

その際、前に - を付けて gunzip の結果を先に表示する

bash-completion

タブ入力でログファイル名を補完して欲しい

~/.bashrc

LANG:bash
_catlog()
{
    COMPREPLY=( `find /var/log -type f 2>/dev/null | sed -r "s/\.[0-9]+(\.gz)?$//" | sed -r "s/\\/var\\/log\\///" | sort -u | grep -E "^$2"` )
}
complete -F _catlog catlog

とすることで、ログファイル一覧を自動補完する。

find /var/log -type f 2>/dev/null でエラーメッセージを捨てながらファイル名を列挙し、

sed -r "s/\.[0-9]+(\.gz)?$//" で末尾の ".数字.gz" を消去する

sed -r "s/\\/var\\/log\\///" で先頭の "/var/log/" を消去する

sort -u でアルファベット順にソートしつつ重複を除く

grep -E "^$2"` で途中まで入力した文字があればその文字列で始まるもののみとする

これを complete -F に渡せば良い

LANG:console
$ catlog ^T
 Display all 140 possibilities? (y or n) n
$ catlog a^T
 alternatives.log                 apache2/error.log                apache2/ssl_access.log           apt/term.log                     auth.log
 apache2/access.log               apache2/other_vhosts_access.log  apt/history.log                  aptitude

コメント・質問





Counter: 348 (from 2010/06/03), today: 4, yesterday: 0