1、awk命令簡(jiǎn)介
awk命令是一種處理文本文件的語(yǔ)言,是一個(gè)強(qiáng)大的文本分析工具。
awk命令也可以叫awk編程,能夠識(shí)別非制表符的空格,可以解決cut命令解決不了的問(wèn)題。
awk命令非常復(fù)雜,本章節(jié)我們只介紹部分常用的功能。
2、awk命令格式
命令格式:awk '條件1{動(dòng)作1} 條件2{動(dòng)作2}…' 文件名
條件:
一般使用關(guān)系表達(dá)式作為條件
x > 10 判斷變量x是否大于10;
x >= 10 判斷變量x是否大于等于10;
x <= 10 判斷變量x是否小于等于10;
動(dòng)作:
格式化輸出;
流程控制語(yǔ)句;
3、awk命令使用說(shuō)明
創(chuàng)建成績(jī)單文件score.txt,內(nèi)容如下:

3.1、提取成績(jī)單中第2列和第4列
執(zhí)行命令:
awk '{printf $2 "\t" $4 "\n"}' score.txt
命令中$2代表第2列,$4代表第4列。命令中沒(méi)有加入任何條件,所以針對(duì)的是文件中的每一行數(shù)據(jù)。對(duì)每一行數(shù)據(jù)打印第2列和第4列。命令執(zhí)行結(jié)果如下圖所示:

3.2、提取按空格分隔的內(nèi)容
使用 df -h 命令,查看空間占用情況。命令輸出內(nèi)容如下圖所示:

df命令輸出結(jié)果是以空格分隔的,而非Tab鍵。
執(zhí)行命令,提取輸出結(jié)果的中FileSystem列和Mounted列:
df -h | awk '{printf $1 "\t" $6 "\n"}'
命令執(zhí)行結(jié)果如下所示:

執(zhí)行以下命令也可以輸出同樣的結(jié)果:
df -h | awk '{print $1 "\t" $6}'

兩條命令區(qū)別:
- printf 不可以自動(dòng)換行,需要在行尾增加換行符;
- print 可以在末尾自動(dòng)換行;
- 在Linux系統(tǒng)中沒(méi)有print命令只有printf命令,在awk命令中兩個(gè)都支持;
3.3、BEGIN
注意:BEGIN必須是大寫(xiě),它是一個(gè)條件。它的作用是強(qiáng)制第一個(gè)執(zhí)行他后面的語(yǔ)句。
執(zhí)行命令:
awk 'BEGIN{printf "Test Begin \n"}{printf $2 "\t" $4 "\n"}' score.txt
執(zhí)行結(jié)果如下圖所示:

BEGIN{printf "Test Begin \n"} 會(huì)在輸出文件內(nèi)容第2列和第4列之前輸出一句話Test Begin。
3.4、END
同BEGIN相類(lèi)似,END是強(qiáng)制最后一個(gè)執(zhí)行它后面的語(yǔ)句。
同時(shí)指定BEGIN和END,執(zhí)行命令:
awk 'BEGIN{printf "Test Begin \n"}{printf $2 "\t" $4 "\n"}END{printf "Test End \n"}' score.txt
輸出結(jié)果如下圖所示:

3.5、FS內(nèi)置變量
可以在BEGIN中通過(guò)FS內(nèi)置變量指定分隔符。
FS=':',表示指定:為分隔符。
cat /etc/passwd | grep "/bin/bash"
查看passwd文件中可登陸用戶(hù)信息,輸出結(jié)果如下圖所示:

指定分隔符按照:分隔,將結(jié)果輸出第一列和第三列,執(zhí)行命令:
cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"} {printf $1 "\t" $3 "\n"}'
命令執(zhí)行結(jié)果如下圖所示:

3.6、關(guān)系運(yùn)算符
篩選出來(lái)語(yǔ)文成績(jī)大于等于90的同學(xué),輸出其名稱(chēng)和語(yǔ)文成績(jī)。執(zhí)行命令:
cat score.txt | awk '$3>=90{printf $2 "\t" $3 "\n"}'
命令執(zhí)行結(jié)果,如下圖所示:

說(shuō)明:awk命令還有其他的功能,其功能非常強(qiáng)大。專(zhuān)門(mén)有書(shū)籍介紹awk命令,有興趣的可以自行摸索使用方法。