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