shell編程三劍客里,awk比另外兩個(gè)命令grep、sed更加復(fù)雜,更加難以掌握,因?yàn)閍wk是可以作為一個(gè)編程語(yǔ)言的!難歸難,但該命令是必須要掌握的命令,因?yàn)樗墓δ軐?shí)在太強(qiáng)大了!
awk基本結(jié)構(gòu)如下:
awk [選項(xiàng)] 'pattern1 {action1} patten2 {action2} ……' filename
-
單引號(hào)是為了和shell命令區(qū)分開(kāi)來(lái)。
-
大括號(hào)表示一個(gè)命令分組??梢允且粋€(gè)動(dòng)作,或多個(gè)動(dòng)作,如果是多個(gè)動(dòng)作,則動(dòng)作之間需要加上;或輸入enter鍵
-
pattern是模式,表示匹配到的行才進(jìn)行action。模式可以是正則,或算術(shù)表達(dá)式等
-
pattern和action可以只有其一,但不能兩者都沒(méi)有
awk常用的選項(xiàng)如下:
-
-F:指定分割符,分割符可以是字符也可以是一個(gè)正則表達(dá)式
-
-v val=value,定義一個(gè)變量并賦值
下面,我來(lái)通過(guò)一個(gè)應(yīng)用來(lái)講解awk命令的使用。下面是一個(gè)文本文件的部分內(nèi)容
# head city.txt 北京 BEIJING BJ 上海 SHANGHAI SH 天津 TIANJIN TJ 重慶 CHONGQING ZQ 阿克蘇 AKESU AKS ……
現(xiàn)在的需求是,獲取每個(gè)城市的全拼,然后轉(zhuǎn)換為小寫形式再連接上hellowx.com。其他的信息全部給過(guò)濾掉。
# awk 'NR%2==0{next}{print}' city.txt | head -n 10 北京 BEIJING BJ 上海 SHANGHAI SH 天津 TIANJIN TJ 重慶 CHONGQING ZQ 阿克蘇 AKESU AKS 安寧 ANNING AN 安慶 ANQING AQ 鞍山 ANSHAN AS 安順 ANSHUN AS 安陽(yáng) ANYANG AY
我們注意到,偶數(shù)行都是空白行。所以只要過(guò)濾偶數(shù)行就行了。這樣過(guò)濾掉了空白行。注意上面的NR表示當(dāng)前行號(hào),意思是偶數(shù)行全部過(guò)濾掉。next表示忽略當(dāng)前行。
接下就需要過(guò)濾第一和第三字段。
# awk 'NR%2==0{next}{print $2}' city.txt | head -n 10 BEIJING SHANGHAI TIANJIN CHONGQING AKESU ANNING ANQING ANSHAN ANSHUN ANYANG
上面的$2表示第二個(gè)字段,結(jié)合print表示只打印第二個(gè)字段。最后就是轉(zhuǎn)換和連接的工作了,就需要使用tr命令了。
# awk 'NR%2==0{next}{print $2}' city.txt | head -n 10 | tr [A-Z] [a-z] | awk '{print $1"hellowx.com"}' beijinghellowx.com shanghaihellowx.com tianjinhellowx.com chongqinghellowx.com akesuhellowx.com anninghellowx.com anqinghellowx.com anshanhellowx.com anshunhellowx.com anyanghellowx.com
tr命令是用來(lái)作轉(zhuǎn)換的,將全部大寫轉(zhuǎn)換我小寫,然后再用awk來(lái)連接上后面的字符串。
對(duì)上面涉及的幾個(gè)命令,如果不是太熟悉可能不是那么容易理解。建議,可以一步一步的來(lái)。熟悉了第一步而,然后再去理解第二部。
最后,希望大家可以認(rèn)真去學(xué)習(xí)下這個(gè)命令,如果掌握了awk,就可以做出很多有意思的事情哦!