Linux awk+uniq+sort 統計文件中某字符串出現次數並排序

https://blog.csdn.net/qq_28766327/article/details/78069989正則表達式

 

    在服務器開發中,咱們常常會寫入大量的日誌文件。有時候咱們須要對這些日誌文件進行統計。Linux中咱們能夠利用如下命令簡單高效的實現這一功能。vim

須要用到的命令簡介

  • 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<分隔字符>:指定排序時所用的欄位分隔字符;ui

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

如今咱們開始

1 讀入文件spa

cat test.log.2017-09-20 
  • 1

執行結果 
    這裏寫圖片描述.net

2 從每一行取出咱們須要的字符串日誌

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

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

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

會被分割成server

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

三部分 
其中第二部分」com.ford.fordmobile」是我所須要的字段blog

而’{print $2}’的意思是將每行獲得的第二個值打印出來,$0表明獲取的全部值 
執行效果以下 
    這裏寫圖片描述

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

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

執行結果 
這裏寫圖片描述 
能夠看到相同行已經被排在了一塊兒

4 統計數量與去重

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

uniq -c 中的-c 表明在每列旁邊顯示該行重複出現的次數 
執行結果 
這裏寫圖片描述

5 按重複次數排序

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

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

執行結果

6 將結果輸出到文件中

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

能夠看到咱們當前目錄已有testfile 目錄 
用vim 打開能夠看到 
這裏寫圖片描述

相關文章
相關標籤/搜索