日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux awk+uniq+sort 统计文件中某字符串出现次数并排序

發布時間:2025/3/20 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 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

會被分割成

sdate=2017-09-20 23:59:32& com.ford.fordmobile _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 打開可以看到

終于寫完了,點個贊唄!

。:.゚ヽ(。???。)ノ゚.:。+゚

如果有幫到您,打個賞唄

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Linux awk+uniq+sort 统计文件中某字符串出现次数并排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。