通過幾個案例講解linux下的awk命令

shell編程三劍客里,awk比另外兩個命令grep、sed更加復雜,更加難以掌握,因為awk是可以作為一個編程語言的!難歸難,但該命令是必須要掌握的命令,因為它的功能實在太強大了!

awk基本結構如下:

awk?[選項]?'pattern1?{action1}?patten2?{action2}?……'?filename
  • 單引號是為了和shell命令區分開來。

  • 大括號表示一個命令分組。可以是一個動作,或多個動作,如果是多個動作,則動作之間需要加上;或輸入enter鍵

  • pattern是模式,表示匹配到的行才進行action。模式可以是正則,或算術表達式等

  • pattern和action可以只有其一,但不能兩者都沒有

awk常用的選項如下:

  • -F:指定分割符,分割符可以是字符也可以是一個正則表達式

  • -v val=value,定義一個變量并賦值

下面,我來通過一個應用來講解awk命令的使用。下面是一個文本文件的部分內容

#?head?city.txt? 北京?BEIJING?BJ  上海?SHANGHAI?SH  天津?TIANJIN?TJ  重慶?CHONGQING?ZQ  阿克蘇?AKESU?AKS  ……

現在的需求是,獲取每個城市的全拼,然后轉換為小寫形式再連接上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

我們注意到,偶數行都是空白行。所以只要過濾偶數行就行了。這樣過濾掉了空白行。注意上面的NR表示當前行號,意思是偶數行全部過濾掉。next表示忽略當前行。

接下就需要過濾第一和第三字段。

#?awk?'NR%2==0{next}{print?$2}'?city.txt??|?head?-n?10 BEIJING SHANGHAI TIANJIN CHONGQING AKESU ANNING ANQING ANSHAN ANSHUN ANYANG

上面的$2表示第二個字段,結合print表示只打印第二個字段。最后就是轉換和連接的工作了,就需要使用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命令是用來作轉換的,將全部大寫轉換我小寫,然后再用awk來連接上后面的字符串。

對上面涉及的幾個命令,如果不是太熟悉可能不是那么容易理解。建議,可以一步一步的來。熟悉了第一步而,然后再去理解第二部。

最后,希望大家可以認真去學習下這個命令,如果掌握了awk,就可以做出很多有意思的事情哦!

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享