各コマンドについて
wcコマンド
Word Countの略で単語数や行数を数えるコマンド。
grepコマンド
ファイルの中の文字列に対して正規表現を使って検索するコマンド。
cutコマンド
各行の一部を出力するコマンド。
uniqコマンド
連続して重複した行を1つにまとめる
同じファイル内に同じ行があったとしても、連続していないとまとめられないため、sortコマンドとよく一緒に使用される。
-dで重複している行のみを抽出したり-uで重複した行をまとめるのではなく削除したりする。
sortコマンド
行の並び替えができるコマンド。
2行目でソートさせたい場合には-kを付けるとできる。
$ sort -k2 fuga.txt
1 22
6 24
2 34
7 4
5 43
4 46
8 5
9 5
3 53
一見ソートされていないように見えるが、2がつく数字が上に来るようにソートされている。
数値としてソートさせるには-nオプションが必要。
$ sort -k2n fuga.txt
7 4
8 5
9 5
1 22
6 24
2 34
5 43
4 46
3 53
実際にやってみる
アクセスログを実際に集計してみる(練習)
ログの総件数を求める
$ wc -l access_log.20170201
4661 access_log.20170201
$ wc -l access_log.20170201 access_log.20170202
34661 access_log.20170201
34785 access_log.20170202
69446 合計
wcコマンドの引数にファイルを指定すれば、件数を表示してくれる。
-lオプションで行数だけを表示させることができる。
注意点としては改行があって1行とカウントされるので、改行が一つもないと中身が存在しても0行になってしまう。
hoge.phpへの全アクセス数を求める
$ grep hoge.php access_log.20170201 | wc -l
5633
grepでhoge.phpが含まれる行だけを出力し、それをwcコマンドの渡すことでhoge.phpに対するアクセス数を計算している。
hoge.phpへの12時台のアクセス数を求める
$ grep 01/Feb/2017:12 access_log.20170201 | grep hoge.php | wc -l
672
上記の例にさらにgrepで検索を行っている。
ログファイル中のユニークなIPアドレスのリストを求める
$ cat access_log.20170201 | cut -d ' ' -f 1 | sort | uniq
10.11.12.13
10.11.12.14
10.11.12.15
cutコマンドは-dオプションでデリミタを指定して-fオプションでフィールドを指定している。
今回の場合スペースで区切られたフィールドのうち、最初のフィールドのみを出力させている。
それに対してsortコマンドで重複が連続するようにした後に、uniqコマンドで重複をまとめている。
IPアドレスごとのhoge.phpへのアクセス数を求める
$ grep hoge.php access_log.20170201 | cut -d ' ' -f 1 | sort | uniq -c
30 10.11.12.13
3 10.11.12.14
223 10.11.12.15
uniquコマンドに-cオプションをつけることで重複した行数を先頭に付加することができるため、何行あるかを表示できる。
時間帯ごとのhoge.phpへのアクセス数を求める
$ grep 01/Feb/2017 access_log.20170201 | grep hoge.php | cut -b 25-31 | sort | uniq -c
420 2017:00
512 2017:01
641 2017:02
167 2017:03
143 2017:04
174 2017:05
298 2017:06
387 2017:07
476 2017:08
367 2017:09
410 2017:10
699 2017:11
802 2017:12
1043 2017:13
1536 2017:14
1833 2017:15
1409 2017:16
1902 2017:17
2367 2017:18
2435 2017:19
2525 2017:20
2362 2017:21
1958 2017:22
1400 2017:23
cut -b 25-31ってところがいけてないけど、他に思いつかなかった。