1. 程式人生 > >日誌分析命令awk基礎用法

日誌分析命令awk基礎用法

pri 取出 http 我只 修飾符 日誌 自動 文本處理工具 ssi

awk

awk是一個很好用的文本處理工具,相對於sed常用用作一整行的處理,awk則比較擅長將一行分成數個字段來處理。而在我們性能測試中,可以awk可以幫助我們造數,也可以幫助我們分析日誌。

簡單來說,awk就是用一個循環實現的。首先awk讀取文本的一行(默認是從第一行開始,淡然也可以根據條件選擇行),然後根據你給的條件來處理這行的某個字段;處理完成後,再讀取下一行,然後再根據條件去處理字段,直到處理完成所有的行。

awk的標準格式

awk ‘條件類型1{動作1} 條件類型2{動作2}.......‘

awk常用的內置變量

NR:現在處理的是第幾行數據

NF:每行一共的字段數 可以用來取倒數第一列,第二列,例如:awk ‘{print $(NF-1),$NF }‘ test01.txt $NF 代表最後一列,$(NF-1)代表倒數第二列

$0:代表一整行數據

$1:代表第一個字段,以此類推

RS 輸入行分隔符(默認為回車)

ORS 輸出行分隔符(默認為回車)

FS 字段分隔符(默認為空格)

-F 指定多個字段分隔符並且支持正則表達式(比FS更加強大一些)

OFS 輸出字段分隔符(默認為空格)

格式化輸出

print函數

特性

  1. 參數可以是變量、計算值、或字符串常量

  2. 字符串必須用雙引號括起來

  3. 參數之間用逗號分隔(輸出分隔符由變量OFS決定)

  4. 輸出可以被重定向

  5. 輸出和輸入之間可以通過管道

printf函數

特性

  1. 返回給標準輸出一個帶有格式的字符串

  2. 不會在行尾自動換行

  3. 包含一個加引號的字符串

修飾符

  1. “-” 左對齊

  2. # 八進制加0 十六進制加0x

  3. + 加上正負號+或-

  4. 0 用0填充空白符

條件語句

格式:{if{(expression){

statement; statement;….

}

else if(expression){

statement; statement;….

}

else{ statement; statement;….

}

}

可以使用條件,對字段進行處理

實戰演練

例1

如下文本我只想要第一列和第三列然後重定向到test001.txt中

技術分享圖片

awk ‘{print $1,$3}‘ example.txt >test001.txt

技術分享圖片

例2

如果字段的分隔符不是空格,那麽我們需要先提前指定分隔符,使用-F或者FS,以passwd文件為例,每個字段是以冒號分隔的,我們想取出第二個字段,和第七個字段

技術分享圖片

awk -F‘:‘ ‘{print $2,$7}‘ /etc/passwd

技術分享圖片

例3

默認出輸出字段分隔符是空格,如果想改變默認輸出分隔符呢,比如改成|

文本test001,原來的內容

技術分享圖片

awk ‘{OFS="|"}{print $1,$2}‘ test001.txt

技術分享圖片

例4

默認輸出行分隔符是回車,如果想把分隔符改成|呢,

文本test001,原來的內容,默認行分隔符為回車

技術分享圖片

例5

如果要處理的文本,默認不是以回車作為行的分隔符,我們希望處理之後,以回車作為空格符

要處理的文本,以”_”作為行的分隔符,我們想以回車為分隔符

技術分享圖片

awk ‘BEGIN{RS="_"}{print $0}‘ test003.txt

技術分享圖片

例6

業務要求,一個播種墻號,對應一個波次號,播種墻號不能重復。文件中已有波次號(第二列),是重復的,但是每個號重復的數量不確定;需要自己添加播種墻號,播種墻號是連續的

技術分享圖片

思路:使用awk進行處理,先讀取第一行的播次號,把他賦值給一個變量,然後拿每行的波次號和這個變量相比較,如果相等,則播種墻號不變,如果不等,則播種墻號+1

由於語句較長,因此,寫成shell腳本

技術分享圖片

#$1的值賦值給qiang這個變量(這裏的$1、$2指的是shell的參數,不是awk裏面的)

#$2的值賦值給boci這個變量

#進行判斷,如果$2(即文件裏波次號)的值等於變量boci的值,那麽輸出原始文件整行和播種墻號

#如果$2(即文件裏波次號)的值不等於變量boci的值,播種墻號+1,然後輸出輸出原始文件整行和播種墻號

日誌分析命令awk基礎用法