本文參考awk英文Tutorial和三十分鐘學(xué)會(huì)awk惦银,對(duì)awk做了一個(gè)非常簡(jiǎn)單的介紹握侧,如果需要更詳細(xì)的用法可以去看上面的鏈接趟济。
awk是一種編程語(yǔ)言,用于在linux/unix下對(duì)文本和數(shù)據(jù)進(jìn)行處理。在linux中,grep 更適合單純的查找或匹配文本, sed 更適合編輯匹配到的文本, awk 更適合格式化文本,對(duì)文本進(jìn)行較復(fù)雜格式處理。
awk把文件逐行讀入检吆,然后以空格為默認(rèn)分隔符將每行切片,切開(kāi)的部分再進(jìn)行各種處理程储。
基本語(yǔ)法
awk的基本語(yǔ)法如下:
awk 動(dòng)作 文件名
awk [options] 'pattern{action}' file
pattern 表示 AWK 在數(shù)據(jù)中查找的內(nèi)容(就是要表示的正則表達(dá)式)蹭沛,用斜杠括起來(lái)。
action 是在找到匹配內(nèi)容時(shí)所執(zhí)行的一系列命令章鲤。
awk會(huì)根據(jù)空格和制表符摊灭,將每一行分成若干字段,依次用$1
败徊、$2
帚呼、$3
代表第一個(gè)字段、第二個(gè)字段皱蹦、第三個(gè)字段等等煤杀。
舉個(gè)例子。awk '{print $5}' demo.txt
沪哺,表示輸出信息的第五列沈自。
$*
表示第*列。
$0
表示當(dāng)前整個(gè)行辜妓。
$NF
為最后一列枯途。
pattern
pattern是條件,符合這個(gè)條件的行才會(huì)被繼續(xù)處理籍滴。
- BEGIN語(yǔ)句塊:在程序開(kāi)始時(shí)執(zhí)行酪夷,它只執(zhí)行一次,在這里可以初始化變量.BEGIN是AWK的關(guān)鍵字孽惰,因此它必須為大寫晚岭,注意,這個(gè)語(yǔ)句塊是可選的勋功。
- BODY語(yǔ)句塊:此塊中的命令會(huì)對(duì)輸入的每一行執(zhí)行坦报,我們也可以通過(guò)提供模式來(lái)控制這種行為辅甥。注意,BODY語(yǔ)句塊沒(méi)有關(guān)鍵字燎竖。
- END語(yǔ)句塊:在程序的最后執(zhí)行,END是AWK的關(guān)鍵字要销,因此必須為大寫构回,它也是可選的。
options
-F設(shè)置輸入分隔符疏咐。awk默認(rèn)使用空格作為分隔符纤掸,連續(xù)多個(gè)空格算作一個(gè)。如果用其他分隔符浑塞,可以用-F參數(shù)制定分隔符為冒號(hào)借跪。比如:awk -F ':' '{print $5}' demo.txt
。
可以用-v FS='#'來(lái)指定輸入分隔符酌壕,-v OFS='--' 來(lái)指定輸出分隔符(參考下面的內(nèi)置變量)掏愁。
action
awk '{print $1 $2}'
表示連接在一起輸出。
awk '{print $1,$2}'
表示用分隔符隔開(kāi)輸出卵牍。
variable
內(nèi)置變量:FS(輸入分隔符果港,默認(rèn)是空格和制表符)
OFS(輸出分隔符,默認(rèn)為空格)
RS(輸入時(shí)行分割符糊昙,默認(rèn)為換行符)
ORS(輸出時(shí)行分割符辛掠,默認(rèn)為換行符)
NF(當(dāng)前行被分隔成幾列)
NR(當(dāng)前處理的行號(hào))
FILENAME(當(dāng)前文件名)
ARGC(命令行參數(shù)個(gè)數(shù))
ARGV(命令行參數(shù)的數(shù)組)
FNR(各文件分別記數(shù)的行號(hào),處理>1文件時(shí))释牺。
內(nèi)置變量不需要$來(lái)調(diào)用萝衩。其中,ARGV[0] = awk没咙。之后是其他的參數(shù)(files)猩谊。
自定義變量有兩種方法:
- -v 變量名 = 變量的值 (區(qū)分大小寫)。
- 在{}中定義祭刚。
函數(shù)
awk還提供了一些內(nèi)置函數(shù)预柒,方便對(duì)原始數(shù)據(jù)的處理。
內(nèi)置函數(shù)的列表可以查看這里袁梗。
使用腳本文件
awk [options] -f file ....