1. 程式人生 > >統計日誌中ip登入次數

統計日誌中ip登入次數

cat logs/baidu.access.log | awk '{print $(NF-1)}' | sort | uniq -c | sort -k 1 -n -r|head -10

解釋一下上面的命令,

cat logs/baidu.access.log就是輸出我要統計的日誌。

awk後面跟一個指令,awk '{print $(NF-1)}'就是打印出日誌內容的第幾列。$1就是第一列,$(NF)就是總列數,那麼我要根據倒數第二列統計,就是$(NF-1)。

sort就是對內容進行排序,預設是自然順序排序。

uniq指令用於排重,而是隻適用於相鄰兩行相同的情況。所以一般結合sort使用。即先sort排序再排重。

uniq -u是隻顯示唯一的記錄行。uniq -c是顯示有重複記錄的情況。

sort -k 1 -n -r這個指令,參看下面sort指令引數的詳細說明

sort選項與引數: -f  :忽略大小寫的差異,例如 A 與 a 視為編碼相同; -b  :忽略最前面的空格符部分; -M  :以月份的名字來排序,例如 JAN, DEC 等等的排序方法; -n  :使用『純數字』進行排序(預設是以文字型態來排序的); -r  :反向排序; -u  :就是 uniq ,相同的資料中,僅出現一行代表; -t  :分隔符,預設是用 [tab] 鍵來分隔; -k  :以哪個區間 (field) 來進行排序的意思

所以 sort -k 1 -n -r 指令的意思就是對第一列按照純數字逆序排序。

這個純數字是哪裡來的呢?是uniq -c來的,原來剩下一列就是IP了,當執行uniq -c指令時,它會統計重複記錄的次數並把這次數顯示在第一列。所以現在有兩列了,第一列是重複次數,第二列是IP。所以這裡是按照重複次數排序。

head -10,顯示前10行。

同理,如果你要統計URL的訪問情況就awk url那一列就行了。

有一個檔案ip.txt,每行一條ip記錄,共若干行,哪個命令可以實現“統計出現次數最多的前3個ip及其次數”?

sort ip.txt | uniq -c | sort -rn | head -n 3

首先sort進行排序,將重複的行都排在了一起,然後使用uniq -c將重複的行的次數放在了行首,在用sort -rn進行反向和純文字排序,這樣就按照重複次數從高到低進行了排列,最後利用head -n 3 輸出行首的三行。