業務中にNginxのアクセスログから以下のものを取ってくれと言われやした。
・発生元のIPを知りたい(ステータスコード400のみ)
・ついでにIPごとの発生件数も知りたい
・そんでもって発生元のUser-Agentも知りたい
・その発生元のIPをwhoisで情報取ってきたらもう完璧だね!!!
ここでawk,grep,sort,cutらのコマンドを駆使して、一部分だけ出力するのにもってこいの秘伝の技となります。覚えておくと!めちゃくちゃ便利なのでブログします。
■発生元のIPのソート順
・そもそもアクセスログをheadで出力してみる
1 2 3 4 5 |
# cat access.log |head time:2018-xx-xxTxx:xx:xx+09:00 server_addr:xxx.xxx.xxx.xxx host:xxx.xxx.xxx.xxx method:GET reqsize:478 uri:/file/xxxxxxxxxxxxxx query: status:200 size:728 referer:- ua:xxx.xxx.xxx.xxx forwardedfor:xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx reqtime:0.533 apptime:0.533 user_id:- alternative_id:- timecard_env:- time:2018-xx-xxTxx:xx:xx+09:00 server_addr:xxx.xxx.xxx.xxx host:xxx.xxx.xxx.xxx method:GET reqsize:473 uri:/file/xxxxxxxxxxxxxx query: status:200 size:25953 referer:- ua:xxx.xxx.xxx.xxx forwardedfor:xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx reqtime:0.727 apptime:0.727 user_id:- alternative_id:- timecard_env:- time:2018-xx-xxTxx:xx:xx+09:00 server_addr:xxx.xxx.xxx.xxx host:xxx.xxx.xxx.xxx method:GET reqsize:473 uri:/file/xxxxxxxxxxxxxxx query: status:200 size:7216 referer:- ua:xxx.xxx.xxx.xxx forwardedfor:xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx reqtime:0.794 apptime:0.794 user_id:- alternative_id:- timecard_env:- time:2018-xx-xxTxx:xx:xx+09:00 server_addr:xxx.xxx.xxx.xxx host:xxx.xxx.xxx.xxx method:GET reqsize:2344 uri:/xxxxxxxxxxxxxxx query: status:200 size:119 referer:https://xxx.xxx.xxx.xxx ua:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0 forwardedfor:xxx.xxx.xxx.xxx reqtime:0.274 apptime:0.274 user_id:xxx.xxx.xxx.xxx:- |
次はステータスコード400(8段落目)で、host(3段落目)をawkでソート順に出力してみます。
1 2 3 4 5 6 7 8 9 10 11 |
# cat access.log |grep status:400 |awk '{print $3,$8 }' |sort |uniq -c |sort -nr |head 65 host:xxx.xxx.xxx.xxx status:400 57 host:xxx.xxx.xxx.xxx status:400 43 host:xxx.xxx.xxx.xxx status:400 15 host:xxx.xxx.xxx.xxx status:400 6 host:xxx.xxx.xxx.xxx status:400 5 host:xxx.xxx.xxx.xxx status:400 4 host:xxx.xxx.xxx.xxx status:400 3 host:xxx.xxx.xxx.xxx status:400 3 host:xxx.xxx.xxx.xxx status:400 3 host:xxx.xxx.xxx.xxx status:400 |
■発生元のuser-agentごとに出力
1 2 3 4 5 6 7 8 9 10 11 |
# cat access.log |grep status:400 |awk '{print $3,$8,$11,$12,$13.$14,$15,$16 }' |sort |uniq -c |sort -nr |head 65 host:xxx.xxx.xxx.xxx status:400 ua:Mozilla/5.0 (Windows NT6.1; WOW64; rv:34.0) 57 host:xxx.xxx.xxx.xxx status:400 ua:Mozilla/5.0 (Windows NT6.1) AppleWebKit/537.36 (KHTML, 43 host:xxx.xxx.xxx.xxx status:400 ua:Mozilla/5.0 (Windows NT6.1; WOW64) AppleWebKit/537.36 15 host:xxx.xxx.xxx.xxx status:400 ua:Mozilla/5.0 (Macintosh; IntelMac OS X 6 host:xxx.xxx.xxx.xxx status:400 ua:Mozilla/5.0 (Macintosh; IntelMac OS X 5 host:xxx.xxx.xxx.xxx status:400 ua:Mozilla/5.0 (Windows NT6.1; WOW64) AppleWebKit/537.36 4 host:xxx.xxx.xxx.xxx status:400 ua:Mozilla/5.0 (iPhone; CPUiPhone OS 11_4 3 host:xxx.xxx.xxx.xxx status:400 ua:Mozilla/5.0 (iPhone; CPUiPhone OS 11_1_2 3 host:xxx.xxx.xxx.xxx status:400 ua:Mozilla/5.0 (Windows NT6.1; WOW64; rv:34.0) 3 host:xxx.xxx.xxx.xxx status:400 ua:Mozilla/5.0 (Windows NT6.1) AppleWebKit/537.36 (KHTML, |
結構手こずった・・・
windowsはWOW!!!とかおもろい。
■上記のIPからwhoisコマンドで居場所を突き止める
・make ip-list.txt in local
とりあえず出力したらローカルに保存してからの..
1 2 3 4 5 6 7 8 9 |
$ cat access.log |grep status:400 |awk '{print $3,$8,$11,$12,$13.$14,$15,$16 }' |sort |uniq -c |sort -nr |head |awk '{print $2}' | cut -d: -f2 xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx |
・for whois
for文でcountryだけを絞って出力します。
1 2 3 4 5 6 7 8 9 10 11 |
$ for i in $(cat ip-list.txt); echo $i $( whois $i |grep country); xxx.xxx.xxx.xxx country: JP country: JP country: JP xxx.xxx.xxx.xxx country: JP country: JP country: JP xxx.xxx.xxx.xxx country: FR xxx.xxx.xxx.xxx country: JP country: JP country: JP xxx.xxx.xxx.xxx country: DE xxx.xxx.xxx.xxx country: FR xxx.xxx.xxx.xxx country: JP country: JP xxx.xxx.xxx.xxx country: JP country: JP country: JP xxx.xxx.xxx.xxx country: JP country: JP country: JP xxx.xxx.xxx.xxx country: JP country: JP |
■まとめ
awk神か!!
ちなみにcat挟まなくても、いきなりgrep access.logしちゃえば
パイプ一個減らせるで。
参考
https://qiita.com/amagumo0207/items/563af1b485ff413d381f
0件のコメント