使用awk截取某時間段的日誌

想要取出文件裏面時間是9點到12點的數據,文件內容以下:

2012-09-05 01:48:47,150 WARN  [WorkManager(3)-72] [service.PhoneRangeManager] phone range domain object not found id 1834930
2012-09-05 02:48:47,293 WARN  [WorkManager(3)-28] [service.PhoneRangeManager] phone range domain object not found id 1834930
2012-09-05 03:50:14,085 WARN  [WorkManager(3)-61] [service.PhoneRangeManager] phone range domain object not found id 1881137
2012-09-05 04:50:14,223 WARN  [WorkManager(3)-67] [service.PhoneRangeManager] phone range domain object not found id 1881137
2012-09-05 05:50:14,361 WARN  [WorkManager(3)-14] [service.PhoneRangeManager] phone range domain object not found id 1881137
2012-09-05 06:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
2012-09-05 07:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
2012-09-05 08:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
2012-09-05 10:51:29,011 WARN  [WorkManager(3)-70] [service.UserAccountLockService] Thread :325 continue to wait for lock of user :13620003572 , signal = TransactionImple < ac, 
BasicAction: -3f57fefa:8d29:50463160:ddaee80 status: ActionStatus.RUNNING >, lock :com.wxxr.common.service.UserAccountLockService$Lock@10b3d72
2012-09-05 11:52:02,732 WARN  [WorkManager(3)-46] [service.PhoneRangeManager] phone range domain object not found id 1881137
2012-09-05 12:52:02,873 WARN  [WorkManager(3)-19] [service.PhoneRangeManager] phone range domain object not found id 1881137
2012-09-05 09:52:03,010 WARN  [WorkManager(3)-95] [service.PhoneRangeManager] phone range domain object not found id 1881137

須要注意的是一條日誌可能佔兩行。
執行代碼以下:
awk -F'[ -:]' '$4 >= 9 && $4 <= 12{print;nextline=NR+1}$1$2$3 !~ /\d+/ && NR == nextline' data
 
講解:

awk內置變量

awk有許多內置變量用來設置環境信息,這些變量能夠被改變,下面給出了最經常使用的一些變量。正則表達式

ARGC 命令行參數個數
ARGV 命令行參數排列
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數
FS 設置輸入域分隔符,等價於命令行 -F選項
NF 瀏覽記錄的域的個數
NR 已讀的記錄數
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符dom

awk是行處理器: 相比較屏幕處理的優勢,在處理龐大文件時不會出現內存溢出或是處理緩慢的問題,一般用來格式化文本信息
awk處理過程: 依次對每一行進行處理,而後輸出
awk命令形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
 [-F|-f|-v]   大參數,-F指定分隔符,-f調用腳本,-v定義變量 var=value
'  '          引用代碼塊
BEGIN   初始化代碼塊,在對每一行進行處理以前,初始化代碼,主要是引用全局變量,設置FS分隔符
//           匹配代碼塊,能夠是字符串或正則表達式
{}           命令代碼塊,包含一條或多條命令
;          多條命令使用分號分隔
END      結尾代碼塊,在對每一行進行處理以後再執行的代碼塊,主要是進行最終計算或輸出結尾摘要信息
 
特殊要點:
$0           表示整個當前行
$1           每行第一個字段
NF          字段數量變量
NR          每行的記錄號,多文件記錄遞增
FNR        與NR相似,不過多文件記錄不遞增,每一個文件都從1開始
\t            製表符
\n           換行符
FS          BEGIN時定義分隔符
RS        輸入的記錄分隔符, 默認爲換行符(即文本是按一行一行輸入)
~            匹配,與==相比不是精確比較
!~           不匹配,不精確比較
==         等於,必須所有相等,精確比較
!=           不等於,精確比較
&&      邏輯與
||             邏輯或
+            匹配時表示1個或1個以上
/[0-9][0-9]+/   兩個或兩個以上數字
/[0-9][0-9]*/    一個或一個以上數字
FILENAME 文件名
OFS      輸出字段分隔符, 默認也是空格,能夠改成製表符等
ORS        輸出的記錄分隔符,默認爲換行符,即處理結果也是一行一行輸出到屏幕
-F'[:#/]'   定義三個分隔符
相關文章
相關標籤/搜索