ソフトウェア/catlog
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: 1929 (from 2010/06/03),
today: 1,
yesterday: 1