proftpdのログがあまりにも見づらいものだから何とかならないかと思って、何とかしてみた。
出力
デフォルトでのログは次の通り。
Mon Apr 21 08:40:36 2008 202 xxx.xxx.xxx.xxx 481300506 /path/to/foo b _ o r bar ftp 0 * c
これはbarさんがファイルfooをダウンロードした、というログなんだが
ファイルのパスが長いこともあってかなり見づらい。
そこで、awkで次のように抽出・並び替えしてみた。
Mon Apr 21 08:40:36 bar /path/to/foo
だがまだ長い(ここではfooだけど実際もっともっと長い)。
特に/path/to/があると改行が入ってしまうのでやっぱり見づらい。
そこで、/path/to/部分をrubyで除去してみた。awkだけでできたらいいんだがぱっと思いつかなかった。
Mon Apr 21 08:40:36 bar foo
シェルスクリプト
最初の並べ替えを行うシェルスクリプトは
#!/bin/sh
cat $1 | awk {'if ($12=="o") print $1,$2,$3,$4,$14,$9;}'
if ($12=="o")によりダウンロードのログのみをみている。
/path/to/の除去は
#!/bin/sh
cat $1 |\
awk {'if ($12=="o") print $1,$2,$3,$4,$14,$9;}' |\
ruby -Ku -rkconv -ane '$_.each{|a| b = a.scan(/([^\/]*)\//)[0].concat( a.scan(/.*\/(.*)/)[0]); puts b[0].concat(b[1])}'
で。/path/to/の除去を行うもう少し賢いawkとかないっすかね。mzpさんや。
2008/05/23 mzpの指摘を受け修正。
具体的には、次の2点。
- awkでディレクトリ部分を切るように修正
- いつも"/var/log/proftpd/xferlog"って打つのがめんどくさいから、 引数が空だったらデフォルトを入れる
結果、こうなりました。
#!/bin/sh
default=/var/log/proftpd/xferlog
if [ "$1" = "" ];
then
xferlog=$default
else
xferlog=$1
fi
cat "$xferlog" |\
awk '{ sub(/.*\//,"",$9); print $1,$2,$3,$4,$14,$9}'
2008/6/3 加筆。
当初はGETだけを表示していたが、
第2回目の訂正時に間違えて消してしまった。
なので、どうせまた追加するなら man xferlog の表記に従い、
GETとPUTとDELETEの判別をつけてやろうかと思った。
それぞれの対応は次の通り。
| access-mode | |
| o | outgoing(GET) |
| i | incoming(PUT) |
| d | deleted(DELETE) |
この対応を埋め込んだシェルスクリプトは次の通り。
#!/bin/sh
default=/var/log/proftpd/xferlog
if [ "$1" = "" ];
then
xferlog=$default
else
xferlog=$1
fi
cat "$xferlog" |\
awk '{ if($12=="o") accmode="GET"; \
else if($12=="i") accmode="PUT"; \
else if($12=="d") accmode="DEL"; \
else accmode=" "; \
sub(/.*\//,"",$9); \
print $1,$2,$3,$4,accmode,$14,$9}'
これで、次のような出力が得られる。
Tue Jun 3 11:48:08 PUT dmp foo.zip



最近のコメント