awk用法小結

awk是linux下一款很強大的文本處理工具,也能夠方便的用在shell程序中完成對文本的處理。若是隻是須要awk簡單功能的話,語法很簡單。前段時間學了一點,在此作下總結。linux

1、基本語法正則表達式

按本身的理解來說,awk是逐行對列進行操做的。換句話說,awk每次處理一行,對這一行的每一個「域」處理完以後再處理下一行的域。域的劃分方式能夠本身指定,默認是以空格和製表符來分割。awk語句要在一對單引號內,所要作的操做要在一對花括號內,語法與c語言很相似,融匯貫通便可,如:shell

awk 'BEGIN {FS=":"} {print $1}' /etc/passwd

這條語句的意思是以":"做爲分隔符,輸出/etc/passwd文件的第一列。爲何最前面要加BEGIN這個關鍵字呢?由於awk在作任何操做以前會先讀入一行文本,這樣,第一行的分隔符就不是":"了。因此,加上BEGIN的目的就是讓awk在讀入第一行以前先把分隔符設定好。除了BEGIN關鍵字以外,還有END這個關鍵字,如:數組

awk 'BEGIN {FS=":";print "******"} {print $1} END {print "******"}' /etc/passwd

會以":"爲分隔符,而且在最頭和最尾輸出"******"。bash

此外,花括號加在不一樣的位置,對程序含義有很大影響,如如下兩段程序:ide

awk 'BEGIN {FS=":"} {if ($1=="root") $1="rot";print $1}' /etc/passwd
awk 'BEGIN {FS=":"} {if ($1=="root") {$1="rot";print $1}}' /etc/passwd

第一段程序會輸出/etc/passwd文件第一列的所有內容,並把"root"變爲"rot"輸出,第二段程序只是把"root"變爲"rot"輸出,其餘並未輸出。
函數

2、正則表達式工具

在awk中使用正則表達式要用//括起來,如匹配"passwd"這個字符串,語法是/passwd/。舉個例子,在/etc/passwd文件的第一列匹配"root"關鍵字,若是匹配到則輸出整行,若是匹配不到則不輸出。字符串

awk 'BEGIN {FS=":"} {if ($1~/root/) print $0}' /etc/passwd

3、內置變量和字符串函數it

awk中最經常使用的三個內置變量是FS、NF、NR,三者的含義分別爲分隔符、當前處理的域(數字)、當前行(數字)。

awk內置的字符串函數主要有gsub(r,s),gsub(r,s,t),index(s,t),length(s),match(s,r),split(s,a,fs),sub(r,s),substr(s,p),substr(s,p,n)

一、gsub(r,s)

在$0上用s替換r

二、gsub(r,s,t)

在t上用s替換r

三、index(s,t)

定位出t在s中的位置

四、length(s)

顧名思義

五、match(s,r)

與index相似,不過此時r能夠用正則表達式

六、split(s,a,fs)

將s以分隔符fs分隔開,放入數組a中,如:

awk 'BEGIN {print split("1*2*3",a,"*")}'

爲何要加"BEGIN"呢,按個人理解,awk在開始執行命令語句以前,會讀取後面文件的一行內容做爲輸入,但若是後面不接任何文件,awk就會一直卡在那兒,因此,加上BEGIN的目的就是爲讓awk在讀取文件內容以前就執行命令,不會讓它卡住。

七、sub(r,s)

以s替換r,與gsub不一樣的是,sub只執行一次替換。

八、substr(s,p)

輸出字符串s中第p個字符及以後的字符,如:

awk 'BEGIN {FS=":"} {print substr($1,1,3)}' /etc/passwd

輸出/etc/passwd中第一個字段中三個字符的數據。

相關文章
相關標籤/搜索