LoginSignup
15
15

More than 5 years have passed since last update.

たった一つのcutを通せば、Apacheログは驚くほど扱いやすくなる

Last updated at Posted at 2014-09-07

こんな感じのログがあったとして、

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

15
15
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15