1. 程式人生 > >linux中awk進行日誌文字的處理過濾

linux中awk進行日誌文字的處理過濾

    對於awk命令的介紹可檢視linux命令大全http://man.linuxde.net/awk

    linux下日誌分析很常見也很重要,看見那一片如汪洋般的日誌,想死的心都有了,過濾出關鍵日誌,檢視重要資訊,定位分析問題也是必須要掌握的一門技能;

    因此coding的時候對日誌格式的設計規範很重要,直接決定了bug的定位速度,一般日誌過濾處理主要有以下幾種方式:

    1.查詢關鍵日誌grep
    2.精簡日誌內容 sed
    3.對記錄進行排序sort
    4.統計日誌相關記錄數 awk

    這裡我介紹下awk這種linux中的文字處理技術。

    awk是一種程式語言,用於在linux/unix下對文字和資料進行處理。資料可以來自標準輸入(stdin)、一個或多個檔案,或其它命令的輸出。它支援使用者自定義函式和動態正則表示式等先進功能,是linux/unix下的一個強大程式設計工具。它在命令列中使用,但更多是作為指令碼來使用。awk有很多內建的功能,比如陣列、函式等,這是它和C語言的相同之處,靈活性是awk最大的優勢。


 awk命令格式和選項 語法形式 

    awk [options] 'script' var=value file(s) 

    awk [options] -f scriptfile var=value file(s) 

    常用命令選項 

    -F fs   fs指定輸入分隔符,fs可以是字串或正則表示式,如-F: 

    -v var=value   賦值一個使用者定義變數,將外部變數傳遞給awk 

    -f scripfile  從指令碼檔案中讀取awk命令

    -m[fr] val   對val值設定內在限制,-mf選項限制分配給val的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴充套件功能,在標準awk中不適用。


awk的工作原理 

    awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

     第一步:執行BEGIN{ commands }語句塊中的語句; 

     第二步:從檔案或標準輸入(stdin)讀取一行,然後執行pattern{ commands }語句塊,它逐行掃描檔案,從第一行到最後一行重複這個過程,直到檔案全部     被讀取完畢。

     第三步:當讀至輸入流末尾時,執行END{ commands }語句塊。

     BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變數初始化、列印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中。 

    END語句塊在awk從輸入流中讀取完所有的行之後即被執行,比如列印所有行的分析結果這類資訊彙總都是在END語句塊中完成,它也是一個可選語句塊。 

    pattern語句塊中的通用命令是最重要的部分,它也是可選的。如果沒有提供pattern語句塊,則預設執行{ print },即列印每一個讀取到的行,awk讀取的每一行都會執行該語句塊。

    awk簡單使用:

  1. awk [-v 變數名=變數值] [-Fre] [--] '模式 { 語句 }' 變數名=變數值 檔名  
  2. awk [-v 變數名=變數值] [-Fre] -f 指令碼檔案 [--] 變數名=變數值 檔名  

和sed一樣,awk也支援2中方式呼叫,一種是把awk指令碼直接在命令列寫入,第二種是把awk寫在檔案中在命令列中呼叫。

awk處理方式也與sed類似,對檔案中的每一個輸入行進行處理,每個處理首先判斷是否是模式中匹配的行,是的話就具體執行相應的語句。

不同的是,awk側重與對每一行的列進行處理,並且,awk指令碼和c語言類似也擁有變數,條件判斷,迴圈等複雜語句,所以這裡只能簡單介紹一下基本應用,詳細的請檢視後面給出的相關連結。

而且,awk在處理所有行前和處理完行後各有BEGIN和END語句做預處理和後置處理。

例1:列印日誌中的第2,3列

  1. awk 'BEGIN{FS="@"} {print $2,$3}' demo.log_after_sort   #BEGIN中預處理的是,把@號作為行的列分割符,把分割後的行的第2,3列輸出  
輸出:(對於從sort得出的結果作為輸入)
10117 INFO
10117 INFO
10117 ERROR
10117 ERROR
10117 ERROR
10222 INFO
...略

例2. 統計日誌中INFO,ERROR出現的總數,以及總記錄數

  1. #下面的例子是作為命令列輸入的,利用單引號作為換行標記,這樣就不用另外把指令碼寫進檔案呼叫了  
  2. awk '  
  3. BEGIN {  
  4.   FS="@"  
  5. }  
  6. {  
  7.   if ($3 == "INFO") {info_count++}  
  8.   if ($3 == "ERROR") {error_count++}  
  9. }  
  10. END {  
  11.   print "order total count:"NR           #NR是awk內建變數,是遍歷的當前行號,到了END區域自然行號就等於總數了  
  12.   printf("INFO count:%d ERROR count:%d\n",info_count,error_count)  
  13. } ' demo.log_after_sort  

輸出:

order total count:22
INFO count:5 ERROR count:17

例3. 對指定時間範圍內的日誌進行統計,包括輸出INFO,ERROR總數,記錄總數,每個訂單記錄分類統計

下面的例子綜合了前面sed和sort

  1. sed -f demo.sed demolog.log | sort [email protected] -k2,2n -k3,3r -k1,1 | awk -f demo.awk  
  1. #demo.awk  
  2. BEGIN {  
  3.   FS="@"  
  4.   stime="2011-08-23 19:57:31"  
  5.   etime="2011-08-23 19:57:37"  
  6. }  
  7. $1 > stime && $1 < etime {  
  8.   if ($3 == "INFO") {info_count++}  
  9.   if ($3 == "ERROR") {error_count++}  
  10.   ++total  
  11.   status[$2]=status[$2]"\t"$1"\t"$3"\t"$4"\n"  
  12. }  
  13. END {  
  14.   for(i in status){  
  15.       printf("id:%s:\n%s\n",i,status[i])  
  16.   }  
  17.   print "order total count:"total  
  18.   printf("INFO count:%d ERROR count:%d\n",info_count,error_count)  
  19. } <span style="font-size:18px;"><strong>  
  20. </strong></span>  
輸出:

id:10117:

2011-08-23 19:57:32INFO  status:attr_ids成功儲存為0|100104|0|100105|100107
2011-08-23 19:57:32ERROR  status:新增屬性id,但由於認證分類引數有誤預設取匹配屬性名稱的第一個屬性id:100107

id:10226:

2011-08-23 19:57:32INFO  status:attr_ids不含0跳過
2011-08-23 19:57:32ERROR  status:新增屬性id,但由於沒有屬性在該分類下預設取匹配屬性名稱的第一個屬性id:100104
2011-08-23 19:57:33ERROR  status:新增屬性id,但由於沒有屬性在該分類下預設取匹配屬性名稱的第一個屬性id:100107
2011-08-23 19:57:33ERROR  status:新增屬性id,但由於沒有屬性在該分類下預設取匹配屬性名稱的第一個屬性id:46
2011-08-23 19:57:34ERROR  status:新增屬性id,但由於沒有屬性在該分類下預設取匹配屬性名稱的第一個屬性id:100106
2011-08-23 19:57:35ERROR  status:新增屬性id,但由於沒有屬性在該分類下預設取匹配屬性名稱的第一個屬性id:100105

#這個例子只是舉例說明awk的統計用法,實際運用中可能會統計超時的次數,頁面訪問次數等。

其他實踐時例子:

1. 在本地分支把程式碼修改從一個分支複製到另一個分支(例子的b1022st.txt是一個記錄了檔案新增或修改的變化的檔案路徑名

  1. awk 'BEGIN{FS="b1022-scm/"} {system("cp -rf b1022-scm/"$2" b1022-lpscm/"$2);}' /home/nizen/b1022st.txt  
通過awk和其system命令結合,這樣就把檔案從b1022-scm複製到b1022-lpscm下
  1. BEGIN {  
  2.   running=0
  3.   count=0
  4.   startRow="begin =====>" id            #id,nextId是通過-v 引數從外部傳入  
  5.   endRow="begin =====>" nextId  
  6. }  
  7. $0 ~ startRow{    # ~是匹配運算子,判斷$0是否滿足startRow正則表示式  
  8.   running = 1
  9. #  printf("start\n")  
  10. }  
  11. $0 ~ endRow {  
  12.   running = 0
  13. #  printf("end\n")  
  14. }  
  15. {  
  16.   if(running==1) {      # 僅在startRow 和 endRow 範圍內統計  
  17.     if($0 ~ "it show") {  
  18. #        printf($0"\n")  
  19.         str=$0
  20.         sub(/^.*show times:/, "", str)  
  21.         sub(/ .*$/, "", str)  
  22.         printf(str "\n")  
  23.         count = count + str  
  24.     }  
  25.   }  
  26. }  
  27. END {  
  28.   printf("showTimeCount:"+count)  
  29. }  
6. printf "10ms occur:%.2lf%%\n",t10/total*100 #輸出百分比資料,精確到百分位後2位

    以上awk的簡單使用摘錄自http://blog.csdn.net/ultrani/article/details/6750434

自己試驗的一部分:    通過shell語言編寫自動過濾指令碼,過濾當天的日誌:   1、 實時讀取本地時間       2、二維陣列記錄可用日誌和二維陣列記錄連結變動日誌,END中根據兩個陣列進行輸出篩選和統計       3、顏色輸出文字日誌區分不同類別的日誌          僅實驗以上6種顏色,可自行修改下條語句中的標紅數字,上圖從上到下分別對應顏色33~37      print "\033[40;33m"redConf[i][0]"\t\033[0m"


相關推薦

linuxawk進行日誌文字處理過濾

    對於awk命令的介紹可檢視linux命令大全http://man.linuxde.net/awk     linux下日誌分析很常見也很重要,看見那一片如汪洋般的日誌,想死的心都有了,過濾出關鍵日誌,檢視重要資訊,定位分析問題也是必須要掌握的一門技能;     因此

Linux最常見的文字查詢與處理工具

find find - search for files in a directory hierarchy 最常見的用法是 find <path> -name <filename> ,意思是在<path>目錄以及子目錄下查詢名為<f

Linuxawk命令的簡單用法

.cn inux total com mage 簡單 image 用法 int 一、用例1:   cat /proc/meminfo|grep "MemTotal"|awk ‘{print $2}‘   說明,$2表示第2位,$0表示全部,如需表示$,可用$$轉義。

Linuxawk用法

awk1、awk簡介:awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。2、awk格式:awk是由模式,動作,或者模式和動作的組合組成。模式patt

linuxawk的使用(絕對精華版)

art if語句 算法 函數 格式 number num 返回 數值 在linux中awk絕對是核心工具,特別是在查找搜索這一領域,和掌握sed命令一樣重要 下面為awk的一些基本知識,基於這些知識,可以讓你隨意操控一個文件: 在awk中:()括號為條件塊,{}為執行的

linux awk 學習隨筆

系統環境 http 默認 分隔 分析 hash file $1 排列 awk   awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分

linux計劃任務,系統日誌,故障處理

badblock 解決 用戶驗證 排查 名稱 輸出 分鐘 message 計劃任務管理 計劃任務管理 At 一次性任務設置。 服務腳本:/etc/init.d/atd 使用方法; #at 13:00

linux】--- 高階命令列文字處理工具 sort

二、sort命令  sort 命令對 File 引數指定的檔案中的行排序,並將結果寫到標準輸出。如果 File 引數指定多個檔案,那麼 sort 命令將這些檔案連線起來,並當作一個檔案進行排序。 選項與引數: -f  :忽略大小寫的差異,例如 A 與 a 視為編碼相同

linux】--- 高階命令列文字處理工具 cut

第一: cut命令 cut : 可以從一個文字檔案或者文字流中提取文字列 echo $PATH 選項 -b:僅顯示行中指定直接範圍的內容; -c:僅顯示行中指定範圍的字元; -d:指定欄位的分隔符,預設的欄位分隔符為“TAB”; -f:顯示指定欄位的內容; --comple

關於Linuxnohup.out日誌過大問題/設定定時任務清空

關於Linux中nohup.out日誌過大問題 在此解決如下: 1,在nohup.out 所在目錄建立一個ClearNohup.sh 指令碼,通過定時任務讓其每週清理一次。防止nohup檔案過大問題。 #!/bin/bash # Author: Ljohn # La

linux如何檢視日誌某個異常出現的次數

曾經在面試中碰到過, 今天在伺服器上看日誌時,覺得特別麻煩,於是,想到了統計 theWord是你要搜尋的詞,一般是異常資訊, filename是日誌名稱, perl -e '$/=undef;$_=&

Java呼叫語言技術平臺(LTP) 3.4.0進行漢語文字處理經驗總結

1. 語言技術平臺(LTP)介紹https://www.ltp-cloud.com//Users/zhangyongwei/Downloads/ltp4j2/ltp4j/ltp4j2/ltp4j/target/nar/ltp4j-0.1.0-SNAPSHOT-x86_64-M

Linux常見的日誌檔案和命令

【IT168 伺服器學院】成功地管理任何系統的關鍵之一,是要知道系統中正在發生什麼事。Linux 中提供了異常日誌,並且日誌的細節是可配置的。Linux 日誌都以明文形式儲存,所以使用者不需要特殊的工具就可以搜尋和閱讀它們。還可以編寫指令碼,來掃描這些日誌,並基於它們的內容去

linuxawk命令詳解

簡介awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。awk有3個不同版本: awk、nawk和gawk,未作特別

linux對EINTR錯誤的處理

服務 否則 lan 阻塞 子進程 cep 完成 再次 http https://www.cnblogs.com/flyfish10000/articles/2576885.html   EINTR錯誤的產生:當阻塞於某個慢系統調用的一個進程捕獲某個信號且相應信號處

Linuxsed文字處理工具原理及使用

Sed是什麼? Sed是一種非互動式的流編輯器,可動態編輯檔案;流編輯器則會在編輯器處理資料之前基於預先提供的一組 規則來編輯資料流 Sed本身是一個管道命令,可以分析 standard input 的,主要是用來分析關鍵字的使用、統計等,此外還可 以將資料進行替換、刪除、選中、選取

Linux文字處理三劍客awk、sed、grep入門

AWK命令簡介 AWK是一門解釋型的程式語言,它的名字來源於它的三位作者的姓氏:Alfred Aho,Peter Weinberger和Brian Kernighan。AWK能夠應用於廣泛的計算和資料處理任務。所有的GNU/Linux發行版都自帶GAWK,即GNU AWK,

如何使用 awk 和正則表示式過濾文字或檔案的字串

當我們在 Unix/Linux 下使用特定的命令從字串或檔案中讀取或編輯文字時,我們經常需要過濾輸出以得到感興趣的部分。這時正則表示式就派上用場了。 什麼是正則表示式? 正則表示式可以定義為代表若干個字元序列的字串。它最重要的功能之一就是它允許你過濾一條命令或一個檔案的輸出

Linux 文字處理 sed sort awk

sed -i 's/\t/ ,/g' *.py #(\t)提換為(,)分割 less -S text # 原格式顯示 sort -n -k2 -k4 1.map > 2.map # 排序,-n 依照數字順序,-k 列數 wc 1.map # 統計檔案的行數,字串數,位元

Linux awk統計日誌出現過的IP(或出現次數最多的N個IP)

awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk的用法 awk 'BEGIN{ commands }