awk [options] 'condition{cmd};condition{cmd}' file (分號不必須)
awk 接受標準輸入、管道、文件,逐行處理文本。
options 一覽
| option | 功能 |
|---|---|
| -F | 指定分隔符,默認是tab或者空格; -F '\t\t' 指定為雙tab |
| -v | 設置變量,-v x=aa -v y=bb;awk -v x='hhh' '{print x}' file 不需使用$x取變量如果是x='hhh',需print "'$x'"; |
特殊常量一覽(諸如FS此類常量,取值不需 $)
| 常量 | 含義 |
|---|---|
| FS | field slash 字段分隔符,默認是空格 |
| OFS | field slash 輸出結(jié)果的字段分隔符,默認是空格 |
| RS | row slash 行分隔符,默認是換行符 |
| ORS | row slash 輸出結(jié)果的行分隔符,默認是換行符 |
| NF | number of field 當前行中字段數(shù) |
| NR | number of row 當前行號,和sed一樣,從1開始 |
| FNR | 當前輸入文檔的當前行號,多個文檔時有用 |
| FILENAME | 當前輸入文檔的名稱 |
| $0 | 當前行全部內(nèi)容 |
| $n | 當前行中第n個字段 |
awk比較符
| 比較符號 | 功能 |
|---|---|
| /aaa/ | 全行數(shù)據(jù)正則匹配 |
| !/aaa/ | 全行數(shù)據(jù)正則匹配后取反 |
| ~/aaa/ | 對特定數(shù)據(jù)正則匹配 |
| !~/aaa/ | 對特定數(shù)據(jù)正則匹配后取反 |
| ||、&& 、!=、 >、 <、 >=、<= | 常規(guī)的含義 |
BEGIN & END
begin 是在讀取所有行之前執(zhí)行一次,end是在讀完所有行后執(zhí)行一次;
所有, 一般用BEGIN{cmd;cmd;...}來初始化 END{cmd;cmd;..}來匯總。
內(nèi)置函數(shù)
| 函數(shù)聲明 | 功能 |
|---|---|
| getline; | 讀取下一行,執(zhí)行后不影響其他命令執(zhí)行,$0 NF等都置換為下一行的 |
| next; | 跳轉(zhuǎn)下一行,與getline不同的是,會從頭開始執(zhí)行awk命令 |
| sin(x) | 求x的余弦值 |
| cos(x) | 求x的正弦值 |
| tolower(str) | 轉(zhuǎn)換為小寫字母 |
| toupper(str) | 轉(zhuǎn)換為大寫字母 |
| split(str,arr[,sepr]) | 將str根據(jù)sepr分割,存入到數(shù)組arr中,seperator默認是空格 |
| gsub(regx,str[,t]) | 將t中所有正則regx能匹配到的用str替換,t不寫默認是$0 |
| sub(regx,str[,t]) | 將t中第一個正則regx能匹配到的用str替換,t不寫默認是$0 |
| substr(str,start,step) | 截取字符串,從start起的step個字符 |
| match(str,regx) | 返回正則表達式在字符中的位置 |
| index(str1,str2) | 返回str2在str1中的位置 |
| length(str) | 返回str長度 |
| rand() | 返回一個0到1之間的隨機數(shù) |
| srand(x) | 設置隨機種子 |
| systemtime() | 返回時間戳 |
system("cmd") 在awk中使用shell命令
實用命令
awk -v FS=":" '{print $1}' test.txt 重新定義字段分隔符為:
awk -v FS="[:,-,]" '{print $1}' test.txt 重新定義字段分隔符為:和-
awk -v OFS=". " '{print NR,$0}' file 輸出結(jié)果標上行號
awk '/hello/{print $0}' file 基礎正則,匹配到行中包含hello的打印,{print $0}可省略
fsh all fwyymis ssh "cat /home/homework/log/zhibo-sql/zhibo_sql.log.slow.20201027*" | awk -F '[\]\[\?]' -v OFS=';' '{if(match($0,/URI/)==0){next}else{print $2,$7,$9,$(NF-1)}}' > slow.log.20201027
awk '{printf("%6.2f %s\n",\$2*\$3,$0)}' xxx.data | sort 按照第2列和第3列的乘積 排序輸出
cat access.log.2019070517 | grep /assistantdesk/desk/student/performance | cut -d " " -f 4 | sort | uniq -c | sort -r |head -10 統(tǒng)計日志中第四個參數(shù)(例如ip)出現(xiàn)次數(shù)最多的前10名
head -1 access.log.2019070517 | awk -F ' ' '{for(i=1;i<=NF;i++){print $i}}' | cat -n 一條日志 行轉(zhuǎn)列 并加行號