こんな感じのログがあったとして、
httpd-access.log
192.168.0.1 - - [17/Apr/2014:11:22:33 +0900] "GET /index.html HTTP/1.1" 200 43206 "https://www.google.co.jp/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36"
"mozilla/5.0 (Windows NT 6.1 …… Safari/537.36"
の部分がほしい場合、ワンライナーで書くと以下の様な感じになりました。
ワンライナー
$ for i in `cat httpd-access.log | tr ' ' '\n' | nl -n ln | grep Moz | cut -d ' ' -f 1`;do cat httpd-access.log | cut -d ' ' -f $i- ;done
ちなみに、これを一発でやろうとすると、こうなります。
$ cut -d ' ' -f 12- httpd-access.log
ワンライナーの大半は、何個目からキーワードであるMoz...
が始まるのかを調べるための処理です。今回は、改行して、行数から判断しました。
cut
は、区切り文字を設定でき、更に、-f
で~より前
,~より後
を指定できるので便利です。
$ cut -d '"' -f -1-3-
ネタ元:
たった6個のsedを通せば、Apacheログは驚くほど扱いやすくなる - Qiita
追記
スクリプトらしきものを作りました。あくまでネタですので、ご了承ください。あと、ログはネタ元を引用しました。
$ ./apache_cut.sh httpd-access.log Moz Chr
apache_cut.sh
#!/bin/zsh
sfile=${0:a:t}
case $1 in
-[hH]|-[hH]elp)
echo "
引数1...ファイル名
引数2...キーワード1
引数3...キーワード2
$ ./$sfile httpd-access.log Moz Chr
"
;;
*)
case $# in
1)
cat $1
;;
2)
for i in `cat $1 | tr ' ' '\n' | nl -n ln | grep $2 | cut -d ' ' -f 1`;do cat $1 | cut -d ' ' -f $i- ;done
;;
3)
key1=`cat $1 | tr ' ' '\n' | nl -n ln | grep $2 | awk 'NR==1' | cut -d ' ' -f 1`
key2=`cat $1 | tr ' ' '\n' | nl -n ln | grep $3 | awk 'NR==1' | cut -d ' ' -f 1`
cat $1 | cut -d ' ' -f $key1-$key2
;;
*) echo no var;;
esac
;;
esac