質問: サーバーを勉強している初心者です。 シェルスクリプトを作りアクセスログを集計したいのですが、 やり方が分かりません。 ディレクトリに5年分くらいの日付のあるファイルがあり、 その一つ一つのファイルの中身を集計したいです。 また、集計項目はいくつかあり、これからも増えるかもしれません。 このログの集計結果を1日毎で表示できるようにするには、 for文を利用するのかな?と思ったのですが、 どのようにすればできますでしょうか? 理想としては、 2015-12-5 123 123:a 25 123:b 345 123:c 2015-12-6 356 123:a 56 123:b 456 123:c 56 123:d ・ ・ ・ のような形で表示させたいです。 自分で試してみると、ファイル内全ての日付から集計した結果が表示されてしまいます。 grep "123" /aaa/bbb/ccc/access-log-2015-* | grep "456"| awk '{print $1 $5 $6}' | sort | uniq -c 479 123:a 81 123:b 801 123:c 56 123:d 上記のような感じになってしまいます。 access-log-2015-*の部分が原因だと思うのですが、 どのようにすれば1日毎で表示されるのかが分かりません。 シェルスクリプトを作りたいが、 その前のコマンドの部分でつまずいている状態です。 初歩的な質問で申し訳ありません。 回答頂ければ幸いです。 よろしくおねがい致します。
回答: > > grep "123" /aaa/bbb/ccc/access-log-2015-* | grep "456"| awk '{print $1 $5 $6}' | sort | uniq -c > > > ファイル1つ1つについてのループをファイル個数だけ回ることになります。 `123`と`456`の両方を含む行という条件のようですが、`awk`だけで書けます。 ``` cd /aaa/bbb/ccc for file in access-log-2015-* do echo ${file#access-log-} awk '/123/&&/456/{print $1 $5 $6}' $file | sort | uniq -c done ```