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
この問題を含む Linux・シェル のテストを制限時間つきで解く
Linux・シェルクイズへ