Linux・シェル記述難易度 応用

IP ごとの件数を多い順に出したいのに件数がおかしい。4 行目を正しく直して書いてください。

#!/bin/bash# アクセス元 IP ごとの件数を多い順に表示するawk '{print $1}' access.log > ips.txtuniq -c ips.txt | sort -rn

正答

正答sort ips.txt | uniq -c | sort -rn

次も正解: sort ips.txt | uniq -c | sort -nr / sort ips.txt | uniq -c | sort -r -n / sort ips.txt | uniq -c | sort -n -r / sort < ips.txt | uniq -c | sort -rn / sort < ips.txt | uniq -c | sort -nr / cat ips.txt | sort | uniq -c | sort -rn / cat ips.txt | sort | uniq -c | sort -nr(空白の有無・大文字小文字・末尾のセミコロンは問いません)

解説

uniq は「連続して並んだ」同じ行だけをまとめる。IP がばらばらの順で並んだ ips.txt にそのまま uniq -c をかけると、離れた位置にある同じ IP が別々に数えられる。正しくは sort ips.txt | uniq -c | sort -rn のように、先に sort で同じ行を隣接させる。最後の sort -rn を sort -r に変える直し方は誤りで、件数を文字列として比べるため 10 が 9 より後ろに並ぶ。3 行目の awk は正しく 1 列目を抜き出している。

参考: www.gnu.org

uniqsortawk

この問題を含む Linux・シェル のテストを制限時間つきで解く

Linux・シェルクイズへ