apacheのアクセスログを調べる時に使うコマンドのコピペメモ

apacheのログからアクセス傾向を調べたりすることがちょいちょいあるのですが、その際に使うコマンドをいちいち書くのがめんどくさくなってきたのでメモ。
awkで何番目持ってくるんだっけとか、cutでどこ削るんだっけとか数える手間。

私が使っている環境はだいたいdailyでログローテートするように設定しているので、他の環境だと日付でgrepして絞り込む必要がありそう。
(デフォルト設定だとweeklyだったはず)

// IPごと上位5件
cat access_log | awk '{print $1}' | sort | uniq -c | sort | tail -5
// リクエストごと上位5件
cat access_log | awk -F\" '{print $2}' | sort | uniq -c | sort | tail -5
// リファラごと上位5件
cat access_log | awk -F\" '{print $4}' | sort | uniq -c | sort | tail -5
// 時間ごと
cat access_log | awk '{print $5}' | grep "2017:..:..:.." | cut -b 14-15 | sort | uniq -c
// 分ごと
cat access_log | awk '{print $5}' | grep "2017:10:..:.." | cut -b 17-18 | sort | uniq -c
// 秒ごと
cat access_log | awk '{print $5}' | grep "2017:10:10:.." | cut -b 20-21 | sort | uniq -c

よく使うのはこの辺。

ログファイルをパイプで流し込まずにawkで直接開かせてもいいのですが、コマンドの先頭で明示的にファイル開いた方が視認性良かったり対象変更しやすかったりで楽に思うのでこんな感じで。

リクエスト毎、リファラ毎はダブルクォーテーションで括られているので取り出しやすくて良い感じ。
逆に他の要素拾ってこようとすると面倒くさそう。あまり必要になったこともないですけど。

時間ごとはdailyローテートでやってるので横着してますが、weeklyローテートだと 03/Oct/2017:mm:ss といった形でgrepかけないと日付特定できなくていやん。

今度使う時はここからコピペしよう。
ログの吐き出し方が違っている環境に入った時も少し弄るだけでなんとかなるはず。

linux環境でディレクトリ配下の最新更新ファイルを把握したい

タイトル通りでして、ディレクトリ配下(サブディレクトリ配下含む)のファイルの中から、最新の更新ファイルを調べる必要が出てきました。

カレントから調べるならlsとsortを繋いで終了なのですが、サブディレクトリも調べるとなると少々厄介。
この程度の処理にシェルスクリプト書くのも面倒なので、一撃で終えられるようコマンド繋げましたのでそのメモ。

結論

find ./ -type f -print0 | xargs --null -i ls -l --time-style=long-iso "{}" | sort -k 6,7 | tail -1

以上。これで最新の更新ファイルが一個だけ出力されるはず。
お行儀の良い所ならもうちょいシンプルに以下でも可。

find ./ -type f | xargs ls -l --time-style=long-iso | sort -k 6,7 | tail -1

何をしているのか

find ./ -type f

findコマンドでカレント以下からファイル形式のものだけを検索。

find ./ -type f | xargs ls -l

findで引っ掛けたファイル一覧をlsコマンドでタイムスタンプ出力。

find ./ -type f | xargs ls -l --time-style=long-iso

そのままだとソートに不便なので、日付の形式を変更。

find ./ -type f | xargs ls -l --time-style=long-iso | sort -k 6,7

年月日と時刻でソート。

find ./ -type f | xargs ls -l --time-style=long-iso | sort -k 6,7 | tail -1

最新のファイルのみを表示。

find ./ -type f -print0 | xargs --null -i ls -l --time-style=long-iso "{}" | sort -k 6,7 | tail -1

findとxargsの区切り文字をnull文字にし、lsコマンドで扱えるようにする。

参考サイト
http://takuya-1st.hatenablog.jp/entry/2014/05/07/014251
http://sea-otter-factory.blogspot.jp/2008/07/unix-xargs.html