日誌分析命令awk基礎用法
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函數
特性
參數可以是變量、計算值、或字符串常量
字符串必須用雙引號括起來
參數之間用逗號分隔(輸出分隔符由變量OFS決定)
輸出可以被重定向
輸出和輸入之間可以通過管道
printf函數
特性
返回給標準輸出一個帶有格式的字符串
不會在行尾自動換行
包含一個加引號的字符串
修飾符
“-” 左對齊
# 八進制加0 十六進制加0x
+ 加上正負號+或-
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基礎用法