一、awk概述
akw是一種編程語言,主要用於在Linux和Unix下對文本和數據進行處理,是Linux和Unix下的一個工具。數據可以來自標准輸入,一個或多個文件,或其他命令的輸出。
awk的處理文本和數據的方式是逐行掃描文件,默認從第一行到最后一行,尋找匹配特定模式的行,並在這些行上進行你想要的操作。
二、使用方法
1、命令行模式
1)格式
awk [選項] ['命令部分'] 文件名
注:命令部分為shell變量時需要用雙引號
選項說明:
-F:定義字段分隔符,默認的分隔符是空格
-v:定義變量並賦值
'命令部分'說明:
正則表達式來地址定位
'/root/{awk語句}' sed中:'/root/p' //打印文件中包含root的行
'NR==1,NR==5{awk語句}' sed中:'1,5p' //打印1-5行內容
'/^root/,^ftp/{awk語句}' sed中:'/^root/,/^ftp/p' //打印root開頭和ftp開頭的行內人
{awk語句1;awk語句2;...}
'{print $0;print $1}' sed中:'p' //打印內容,awk語句之間需要用分號隔開
'NR==5{print $0}' sed中:'5p' //打印第5行
BGEIN...END...
'BEGIN{awk語句};{處理中};END{awk語句}'
'BEGIN{awk語句};{處理中}'
'{處理中};END{awk語句}'
2、腳本模式
#!/bin/awk -f //定義魔法字符
三、awk內部相關變量
$0:當前處理行的所有記錄
$n:當前記錄的第n個字段,字段間由分隔符分隔 awk -F: '{print $1,$3}'
NF:當前記錄的字段數(列數) //awk -F: 'print NF'
$NF:最后一列 //$(NF-1)表示倒數第二列
FNR/NR:行號
FS:定義輸入間隔符 //awk 'BEGIN{FS=":"};{print $1,$3}' 此時跟awk -F: '{print $1,$3}'是一樣的
OFS:定義輸出字段分隔符,默認空格 //awk -F: 'BEGIN{OFS="==>"};{print $1,$3}',輸出的$1==>$3,也可以awk -F: '{print $1"==>"$3}這么寫
RS:輸入記錄分隔符,默認換行 //awk -F: 'BEGIN{RS="\t"};{print $1,$3}',相當於以\t來分隔列
ORS:輸出記錄分隔符,默認換行 //awk -F: 'BEGIN{ORS="\t"};{print $1,$3}',輸出用\t來分隔
四、格式化輸出print和printf
1、print,類似echo
date|awk '{print "年份:"$1,"時間:"$4"}'
[xwxxh@xw shell]$ date|awk '{print "年份:" $1,"時間:" $4}'
年份:2020年 時間:星期四
2、printf,類似echo -n 不換行
awk -F: '{printf "%-15s %-10s %-15s" $1,$2,$3}' /etc/passwd
說明:%s:字符類型為字符串,%d為數字類型
%-15s:占用15個字節的字符串,'-'為左對齊方式,默認為右對齊
五、awk變量定義
#awk -v num=2 -F: '{print $num}' /etc/passwd num前加了$符號,此時會打印以:為分隔符的第num列
#awk -v num=2 -F: '{print num}' /etc/passwd num前不加$符號,此時有多少行就會打印多少個num
#awk -v num=1 'BEGIN{print num}'
#awk -v num=1 'BEGIN{print $num}',打印內容為空
注:awk中調用定義的變量時不需要加$
六、awk中BEGIN...END...的運用
1、BEGIN:表示在程序開始之間執行
2、END:表示所有文件處理完成后執行
3、用法:'BEGIN{開始處理之前};{處理中};END{處理結束后}'
七、awk的if和if...else...結構
1、if結構
格式:awk [選項] '{if(表達式) {語句1;語句2....}}' 文件名
2、if...else結構
格式:awk [選項] '{if(表達式) {語句1;語句2...} else {語句3;語句4...}}' 文件名
3、if...elif..else結構
格式:awk [選項] '{if(表達式1) {語句1;語句2...} else if(表達式2) {語句3;語句4...} else {語句5...}}' 文件名
4、for循環結構
#打印1-5
#打印1-10之間的和
5、while循環結構
#打印1-5
#打印1-10之間的和
6、嵌套循環
#命令行模式打印
#awk結構打印
7、統計/etc/passwd中shell的數量
shell[$NF]++:關聯數組,awk遍歷每一行,遇到相同的值就會加1