今回は awk,sort,uniq の組み合わせについて書きます。
awk を sort,uniq と組み合わせると同じ行がいくつあるかカウントすることができます。
ls -l の月情報をカウントする¶
ls -l の出力から第6フィール(月情報)だけを出力します。/^-/でファイルだけを対象にしています。
% ls -l /bin/ | awk '/^-/{print $6}'
9月
10月
11月
10月
10月
10月
..
sort コマンドで出力をソートします。
% ls -l /bin/ | awk '/^-/{print $6}' | sort
10月
10月
10月
10月
10月
..
uniq -c コマンドにかけると重複行をカウントするので集計ができます。
% ls -l /bin/ | awk '/^-/{print $7}' | sort | uniq -c
10 10月
2 11月
21 12月
20 1月
16 2月
30 3月
..
左側の数値が uniq -c がカウントした重複行の個数。
さらに sort -n を使い、カウントが少ない順にソートすると傾向をしらべるのに役立ちます。
% ls -l /bin/ | awk '/^-/{print $6}' | sort| uniq -c | sort -n
2 11月
3 4月
3 7月
4 8月
5 5月
6 9月
..
syslog の時間毎の出力を集計する¶
syslog の時間毎の出力を集計することも簡単にできます。
Apr 14 12:58:32 salt rsyslogd:
Apr 14 12:59:03 salt anacron[1133]:
Apr 14 12:59:03 salt anacron[1133]:
Apr 14 13:04:17 salt avahi-daemon[739]:
Apr 14 13:04:17 salt avahi-daemon[739]:
syslog は上記の様な出力になっています。log の月と日の部分($1,$2)を取り出して、uniq -c でカウントする。log は時間順になっているので sort する必要がない。
% awk '{print $1,$2}' /var/log/syslog|uniq -c
101 Apr 14
2780 Apr 15
-F オプションで区切り記号を空白から変更できるので ‘:’ を指定してみます。以下の場合、$1 は “Apr 14 12”, $2 は “58” , $3 が “32 salt rsyslogd” になります。
Apr 14 12:58:32 salt rsyslogd:
$1 $2 $3
$2 まで指定すると分毎で集計できます。
% awk -F: '{print $1,$2}' /var/log/syslog|uniq -c
1 Apr 14 12 58
2 Apr 14 12 59
7 Apr 14 13 04
1 Apr 14 13 08
1 Apr 14 13 09
カウント数を見やすくするため、uniq -c の後にawkで整形します。
- 時間と分の間に”:”を記述。($4,$5の間を”:”で記述)
- カウント数($1)を最後に表示する。
% awk -F: '{print $1,$2}' /var/log/syslog|uniq -c|awk '{print $2, $3, $4 ":" $5, $1}'
Apr 14 12:58 1
Apr 14 12:59 2
Apr 14 13:04 7
Apr 14 13:08 1
Apr 14 13:09 1
Apr 14 13:10 6
apt-file コマンドのパッケージ名だけを表示する¶
apt-file コマンドでパッケージ名だけほしい時、-l オプションを使いますが、オプションが思い出せない時、awk + uniq でパッケージ名だけを表示させることができます。
% apt-file -l search awk
9base
a2ps
abs-guide
amanda-server
anyremote-data
..
% apt-file search awk | awk -F: '{print $1}' |uniq
9base
a2ps
abs-guide
amanda-server
anyremote-data
awk + sort + uniq の組み合わせは非常に便利なので覚えておくとお得です。