内容
SadServers 2問目の”Saskatoon”: counting IPs.を解きます
問題文
説明: Web サーバーのアクセス ログ ファイルは次の場所にあります。 /home/admin/access.log。 ファイルは HTTP リクエストごとに 1 行で構成され、各行の先頭にはリクエスト者の IP アドレスが含まれます。
このファイル内で最も多くのリクエストがあった IP アドレスを見つけます (同順位はなく、IP は一意です)。 ソリューションをファイルに書き込む /home/admin/highestip.txt。 たとえば、ソリューションが「1.2.3.4」の場合、次のようにできます。 echo "1.2.3.4" > /home/admin/highestip.txt
→/home/admin/access.log ファイル内で一番多く発生しているIPアドレスを特定し、そのIPアドレスを/home/admin/highestip.txtファイルに書き込む
検証方法
テスト: IP アドレスの SHA1 チェックサム sha1sum /home/admin/highestip.txtは 6ef426c40652babc0d081d438b9f353709008e93(解決策を公開せずに検証するための単なる方法です。)
→sha1sum /home/admin/highestip.txtを実行し6ef426c40652babc0d081d438b9f353709008e93と一致していることを確認する
解法
ファイルからIPアドレスを抜き出す
cat /home/admin/access.log | awk -F " " '{print $1}'
awkの-Fオプションで区切り文字を指定する方法 | ITを使っていこう
access.logの1列目に書き込まれているIPアドレスをすべて抽出する
IPアドレスの順番を並べ変える
cat /home/admin/access.log | awk -F " " '{print $1}' | sort
【 sort 】コマンド――テキストファイルを行単位で並べ替える:Linux基本コマンドTips
sortコマンドでIPアドレスの順番を並べかえる
IPアドレスのユニークな数を数える
cat /home/admin/access.log | awk -F " " '{print $1}' | sort | uniq -c
【 uniq 】コマンド――重複している行を削除する:Linux基本コマンドTips
uniq -c コマンドで各行の先頭に出現回数を出力する
※uniqコマンドは連続して重複している行を1行にまとめて表示するコマンドであるため、直前でsortの実行が必須
数の多い順に並べ替える
cat /home/admin/access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -r
【 sort 】コマンド――テキストファイルを行単位で並べ替える:Linux基本コマンドTips
sort -r 逆順で並べ替える
一番上の行を表示する
cat /home/admin/access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -r | head -1
【 head 】コマンド/【 tail 】コマンド――長いメッセージやテキストファイルの先頭だけ/末尾だけを表示する:Linux基本コマンドTips
head -1 1行目だけ表示する
確認結果をファイルに記入する
echo "66.249.73.135" > /home/admin/highestip.txt
検証用コマンドを実行する
sha1sum /home/admin/highestip.txt
私の解決策を確認してくださいをクリック
1行で回答するコマンド
ちなみにヒントを見ると、1行で回答する方法が書かれていました
cat /home/admin/access.log | awk -F " " '{print $1}' | sort | uniq -c | sort -r | head -1 | awk -F " " '{print $2}' > /home/admin/highestip.txt
コメント