1. 程式人生 > >每日一道shell腳本練習(02)

每日一道shell腳本練習(02)

shell awk sort uniq

1. 題目

有日誌 1.log,部分內容如下:

112.111.12.248 - [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com  "/seccode.php?update=0.5593110133088248" 200"http://formula-x.haotui.com/registerbbs.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)"
61.147.76.51 - [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com "/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71" 301"http://xyzdiy.×××thread-1435-1-23.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"

請統計出每個IP的訪問量是多少?

2. 題目分析

根據日誌內容,可以看到IP地址就是第一段的內容,所以只需把1.log的第一段給過濾出來,然後進一步統計每個IP的數量即可。

過濾第一段,使用awk就可以了,而統計每個IP的訪問量則需要排序然後再計算數量,排序使用sort命令,統計每個IP的訪問量用uniq。

3. 具體shell命令

這道題,用shell腳本一條命令就足夠了:

awk  ‘{print  $1}‘  1.log | sort   -n  | uniq  -c | sort  -n

解釋:

  1. awk 命令在分段方面比較有優勢,這裏的{print $1}將第一段打印出來,awk可以用-F指定分隔符,如果不指定分隔符,默認就以空白字符(比如空格、tab等),本題中,IP地址就是第一段。
  2. sort 命令就是排序,-n選項表示以數字的形式排序。如果不加-n,則以ASCII排序,本題的IP地址用數字的形式排序更易區分。
  3. uniq 命令用來去重復,一個文本如果有多行內容是一模一樣的,就使用uniq命令將相同的內容刪除,只保留一行。-c選項作用是計算重復的行數。所以,uniq -c 的作用正好就統計了ip的訪問量。不過,要註意,uniq去重要在排序之後進行。
  4. 最後的sort -n意思是按訪問量大小來排序,請求量越大的ip排在越後面。如果加一個-r選項,sort -nr,就是倒序排序。

4. 結語

這道題目還有另一種解法,明天再更新吧。

每日一道shell腳本練習(02)