在服務器開發(fā)中,我們經(jīng)常會寫入大量的日志文件。有時候我們需要對這些日志文件進行統(tǒng)計。Linux中我們可以利用以下命令簡單高效的實現(xiàn)這一功能。
需要用到的命令簡介
cat命令
參數(shù):
-n 或 –number 由 1 開始對所有輸出的行數(shù)編號?
?-b 或 –number-nonblank 和 -n 相似,只不過對于空白行不編號??
-s 或 –squeeze-blank 當遇到有連續(xù)兩行以上的空白行,就代換為一行的空白行?
| 管道
管道的作用是將左邊命令的輸出作為右邊命令的輸入
awk 命令
awk 是行處理器,優(yōu)點是處理龐大文件時不會出現(xiàn)內(nèi)存溢出或處理緩慢的問題,通常用來格式化文本信息。awk依次對每一行進行處理,然后輸出。
命令形式
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file?
[-F|-f|-v] 大參數(shù),-F指定分隔符,-f調用腳本,-v定義變量 var=value?
’ ’ 引用代碼塊??
BEGIN 初始化代碼塊,在對每一行進行處理之前,初始化代碼,主要是引用全局變量,設置FS分隔符??
// 匹配代碼塊,可以使字符串或正則表達式??
{} 命令代碼塊,包含一條或多條命令??
;多條命令使用分號分隔??
END 結尾代碼塊,對每一行進行處理后再執(zhí)行的代碼塊,主要進行最終計算或輸出
sort 命令
sort將文件的每一行作為一個單位,相互比較,比較原則是從首字符向后,依次按ASCII碼值進行比較,最后將他們按升序輸出。??
-b:忽略每行前面開始出的空格字符;?
-c:檢查文件是否已經(jīng)按照順序排序;??
-d:排序時,處理英文字母、數(shù)字及空格字符外,忽略其他的字符;??
-f:排序時,將小寫字母視為大寫字母;??
-i:排序時,除了040至176之間的ASCII字符外,忽略其他的字符;??
-m:將幾個排序號的文件進行合并;??
-M:將前面3個字母依照月份的縮寫進行排序;??
-n:依照數(shù)值的大小排序;??
-o<輸出文件>:將排序后的結果存入制定的文件;??
-r:以相反的順序來排序;??
-t<分隔字符>:指定排序時所用的欄位分隔字符;
uniq 命令
uniq 命令用于報告或忽略文件中的重復行,一般與sort命令結合使用???
-c或——count:在每列旁邊顯示該行重復出現(xiàn)的次數(shù);??
-d或–repeated:僅顯示重復出現(xiàn)的行列;??
-f<欄位>或–skip-fields=<欄位>:忽略比較指定的欄位;??
-s<字符位置>或–skip-chars=<字符位置>:忽略比較指定的字符;??
-u或——unique:僅顯示出一次的行列;??
-w<字符位置>或–check-chars=<字符位置>:指定要比較的字符。
現(xiàn)在我們開始
1 讀入文件
cat aaa

lockdreamer
2 從每一行取出我們需要的字符串
cat aaa | awk -F '.'? '{print $3}'
-F 指定每一行的分隔符
例子:‘(txt=|&client)’是分隔符,它是一個正則表達式。意義是,用’txt=’或’&client’ 作為分隔符
3 對行進行排序?先排序是因為去重與統(tǒng)計的 ‘unip’命令只能處理相鄰行
cat aaa | awk -F '.'? '{print $3}' |sort

lockdreamer
可以看到相同行已經(jīng)被排在了一起
4 統(tǒng)計數(shù)量與去重
cat aaa | awk -F '.'? '{print $3}' |sort? | uniq -c

lockdreamer
uniq -c 中的-c 代表在每列旁邊顯示該行重復出現(xiàn)的次數(shù)?執(zhí)行結果?
5 按重復次數(shù)排序
cat aaa | awk -F '.'? '{print $3}' |sort? | uniq -c| sort -nr

lockdreamer
sort 的 -n:依照數(shù)值的大小排序;-r 按照相反順序排列
執(zhí)行結果
作者:lockdreamer
鏈接:http://www.itdecent.cn/p/8e6c6252a2f3