1. 程式人生 > 其它 >shell基礎---AWK+UNIQ+SORT 統計檔案中某字串出現次數並排序

shell基礎---AWK+UNIQ+SORT 統計檔案中某字串出現次數並排序

在伺服器開發中,我們經常會寫入大量的日誌檔案。有時候我們需要對這些日誌檔案進行統計。Linux中我們可以利用以下命令簡單高效的實現這一功能。

需要用到的命令簡介

  • cat命令
    cat命令主要有三大功能
    1.一次顯示整個檔案 cat filename
    2.建立一個檔案 cat > fileName
    3.將幾個檔案合併為一個檔案 cat file1 file2 > file
    引數:
    -n 或 –number 由 1 開始對所有輸出的行數編號
    -b 或 –number-nonblank 和 -n 相似,只不過對於空白行不編號
    -s 或 –squeeze-blank 當遇到有連續兩行以上的空白行,就代換為一行的空白行
    -v 或 –show-nonprinting
  • | 管道
    管道的作用是將左邊命令的輸出作為右邊命令的輸入
  • awk 命令
    awk 是行處理器,優點是處理龐大檔案時不會出現記憶體溢位或處理緩慢的問題,通常用來格式化文字資訊。awk依次對每一行進行處理,然後輸出。
    命令形式 awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
    [-F|-f|-v] 大引數,-F指定分隔符,-f呼叫指令碼,-v定義變數 var=value
    ’ ’ 引用程式碼塊
    BEGIN 初始化程式碼塊,在對每一行進行處理之前,初始化程式碼,主要是引用全域性變數,設定FS分隔符
    // 匹配程式碼塊,可以使字串或正則表示式
    {} 命令程式碼塊,包含一條或多條命令
    ;多條命令使用分號分隔
    END 結尾程式碼塊,對每一行進行處理後再執行的程式碼塊,主要進行最終計算或輸出
    由於篇幅限制,可自行查詢更詳細的資訊。這裡awk命令的作用是從檔案中每一行取出我們需要的字串

  • sort 命令
    sort將檔案的每一行作為一個單位,相互比較,比較原則是從首字元向後,依次按ASCII碼值進行比較,最後將他們按升序輸出。
    -b:忽略每行前面開始出的空格字元;
    -c:檢查檔案是否已經按照順序排序;
    -d:排序時,處理英文字母、數字及空格字元外,忽略其他的字元;
    -f:排序時,將小寫字母視為大寫字母;
    -i:排序時,除了040至176之間的ASCII字元外,忽略其他的字元;
    -m:將幾個排序號的檔案進行合併;
    -M:將前面3個字母依照月份的縮寫進行排序;
    -n:依照數值的大小排序;
    -o<輸出檔案>:將排序後的結果存入制定的檔案;
    -r:以相反的順序來排序;
    -t<分隔字元>:指定排序時所用的欄位分隔字元;

  • uniq 命令
    uniq 命令用於報告或忽略檔案中的重複行,一般與sort命令結合使用
    -c或——count:在每列旁邊顯示該行重複出現的次數;
    -d或–repeated:僅顯示重複出現的行列;
    -f<欄位>或–skip-fields=<欄位>:忽略比較指定的欄位;
    -s<字元位置>或–skip-chars=<字元位置>:忽略比較指定的字元;
    -u或——unique:僅顯示出一次的行列;
    -w<字元位置>或–check-chars=<字元位置>:指定要比較的字元。
  • > 命令
    > 是定向輸出到檔案,如果檔案不存在,就建立檔案。如果檔案存在,就將其清空
    另外 >>是將輸出內容追加到目標檔案中。其他同>

現在我們開始

1 讀入檔案

cat test.log.2017-09-20 

執行結果

2 從每一行取出我們需要的字串

cat check_info.log.2017-09-20 | awk -F '(txt=|&client)' '{print $2}'

awk 命令中 -F 指定每一行的分隔符 在這裡 ‘(txt=|&client)’是分隔符,它是一個正則表示式。意義是,用’txt=’或’&client’ 作為分隔符
舉例來說下面這行

sdate=2017-09-20 23:59:32&txt=com.ford.fordmobile&client_id=x

會被分割成

  1. sdate=2017-09-20 23:59:32&
  2. com.ford.fordmobile
  3. _id=x

  • 其中第二部分”com.ford.fordmobile”是我所需要的欄位

而’{print$2}’的意思是將每行得到的第二個值打印出來,$0代表獲取的所有值
執行效果如下

3 對行進行排序
先排序是因為去重與統計的 ‘unip’命令只能處理相鄰行

cat check_info.log.2017-09-20 | awk -F '(txt=|&client)' '{print $2}'|sort

執行結果

可以看到相同行已經被排在了一起

4 統計數量與去重

cat check_info.log.2017-09-20 | awk -F '(txt=|&client)' '{print $2}'| sort | uniq -c

uniq -c 中的-c 代表在每列旁邊顯示該行重複出現的次數
執行結果

5 按重複次數排序

cat check_info.log.2017-09-20 | awk -F '(txt=|&client)' '{print $2}'| sort | uniq -c | sort -nr

sort 的 -n:依照數值的大小排序;-r 按照相反順序排列

執行結果

6 將結果輸出到檔案中

cat check_info.log.2017-09-20 | awk -F '(txt=|&client)' '{print $2}'| sort | uniq -c | sort -nr > testfile

可以看到我們當前目錄已有testfile 目錄
用vim 開啟可以看到

link: https://www.cnblogs.com/wangbaihan/p/9262296.html https://www.freesion.com/article/36231327298/