AWK是Linux上卓越的文本處理工具蜗巧,它具有非常簡單的語法結(jié)構(gòu),擁有強(qiáng)大的文本處理能力。AWK 是一種解釋執(zhí)行的編程語言,AWK 的名稱是由它們設(shè)計(jì)者的名字縮寫而來 —— Afred Aho, Peter Weinberger 與 Brian?Kernighan钟哥。
目前總共有如下幾種不同的 AWK 版本。
AWK——這個(gè)版本是 AWK 最原初的版本瞎访,它由 AT&T 實(shí)驗(yàn)室開發(fā)腻贰。
NAWK ——NAWK(New AWK)是 AWK 的改進(jìn)增強(qiáng)版本。
GAWK—— GAWK 即 GNU AWK扒秸,所有的 GNU/Linux 發(fā)行版都包括 GAWK播演,且 GAWK 完全兼容 AWK 與 NAWK。
AWK 可以做非常多的工作伴奥。 下面只是其中部分 AWK 的典型應(yīng)用場景:
文本處理写烤,
生成格式化的文本報(bào)告,
進(jìn)行算術(shù)運(yùn)算拾徙,
字符串操作洲炊,以及其它更多。
linux 默認(rèn)安裝了gawk尼啡,使用which gawk暂衡,如果輸出/bin/gawk,說明已經(jīng)安裝了gawk,否則需要我們安裝崖瞭,可以使用 yum 包管理工具安裝:
[root]# yum install gawk
另外我們也可以通過源碼編譯的方式安裝gawk:
step 1——從可信的源下載源代碼狂巢。可以在命令行使用 wget 命令下載读恃。
[jerry]$ wget http://ftp.gnu.org/gnu/gawk/gawk-4.1.1.tar.xz
step 2——解壓并提取下載的源代碼隧膘。
[jerry]$ tar xvf gawk-4.1.1.tar.xz
step 3——切換至解壓后的目錄并運(yùn)行 configure 命令
[jerry]$ ./configure
step 4——configure 命令成功執(zhí)行后會生成一個(gè) Makefile 文件代态。 接下來使用 make 命令編譯源代碼寺惫。
[jerry]$ make
step 5——你可以運(yùn)行測試工具保證 build 是干凈的。 這一步是可選的蹦疑。
[jerry]$ make check
step 6——最后一步西雀,安裝 AWK。 安裝前請確認(rèn)你有超級用戶的權(quán)限歉摧。
[jerry]$ sudo make install
通過以上六個(gè)步驟艇肴,你就成功地編譯并安裝了 AWK。 你可以通過如下的命令來確認(rèn) awk 安裝成功:
gawk的版本通過: gawk --version 查看
[jerry]$ which awk
執(zhí)行上面的命令叁温,你將會得到如下的結(jié)果:
/usr/bin/awk
awk的工作流程:
讀( Read )再悼、執(zhí) 行( Execute )與重復(fù)( Repeat )
讀入一行執(zhí)行一行,直到文件末尾膝但。
gawk的程序結(jié)構(gòu):
開始塊(BEGIN block)冲九,以大寫B(tài)EGIN開頭,必須大寫跟束,這一部分是可選的莺奸,可有可無丑孩。如:
BEGIN {awk-commands}
主體塊(Body Block),如:
/pattern/ {awk-commands}
結(jié)束塊(END Block)灭贷,以大寫END結(jié)束温学,必須大寫,這一部分是可選的甚疟,可有可無仗岖。如:
END {awk-commands}
awk的整體語法格式是: awk '/pattern/ {action}' file?
其中單引號是為了和shell命令區(qū)分開;
/pattern/ 是一個(gè)過濾器览妖,匹配這個(gè)模式的行才會被action的命令處理箩帚;
{}是一個(gè)命令組,action是具體執(zhí)行的命令黄痪;
file是要處理的文件
其中/pattern/ 和{action}必須要有一個(gè)紧帕,
awk可以直接在命令行執(zhí)行執(zhí)行命令,也可以通過編寫好腳本桅打,然后執(zhí)行腳本是嗜。
通過命令行的方式:
輸出marks.txt文件的內(nèi)容:
[jerry]$ awk '{print}' marks.txt?
再比如輸出tomcat日志:
gawk '{print}' /usr/local/apache-tomcat-8.0.30/logs/catalina.out
另外一種提供 AWK 命令的方式——通過腳本文件提供:
awk [option] -f file ....
首先,創(chuàng)建一個(gè)文本文件 command.awk挺尾,在文件中輸入如下 AWK 命令:
{print}
現(xiàn)在鹅搪,我們可以調(diào)用 AWK 從文本文件中讀入命令并執(zhí)行。這里遭铺,我們實(shí)現(xiàn)了與上面例子相同的效果:
[jerry]$ awk -f command.awk marks.txt
awk有一些標(biāo)準(zhǔn)選項(xiàng):
-v 選項(xiàng)
這個(gè)選項(xiàng)可以為變量賦值丽柿。它允許在程序執(zhí)行之前為變量賦值。下面是一個(gè) -v 選項(xiàng)使用的示例程序:
[jerry]$ awk -v name=Jerry 'BEGIN{printf "Name = %s\n", name}'
執(zhí)行上面的命令可以得到如下的結(jié)果:
Name = Jerry
--dump-variables[=file] 選項(xiàng)
此選項(xiàng)會將全局變量及相應(yīng)值按序輸出到指定文件中魂挂。默認(rèn)的輸出文件名是 awkvars.out甫题。
[jerry]$ awk --dump-variables ''
[jerry]$ cat awkvars.out?
awk的基本使用示例:
默認(rèn)情況下,如果某行與模式串匹配涂召,AWK 會將整行輸出:
[jerry]$ awk '/a/ {print}' marks.txt
這個(gè)輸出marks.txt文件中匹配 a 字符的所在行坠非。
輸出某一列,比如輸出第三列:
[jerry]$ awk '/a/ {print $3}' marks.txt
統(tǒng)計(jì)模式串成功匹配的次數(shù)果正,并將該結(jié)果打印出來:
[jerry]$ awk '/JVM/ {++count} END {print count }' catalina.out?
輸出字符數(shù)多于 18 的行:
[jerry]$ awk 'length($0) > 18' marks.txt
查詢文件中匹配的字符:
awk '/uid=10001/' catalina.out
在catalina.out文件中找匹配uid=10001的行炎码,和 grep類似的功能。
awk '/uid=10*/' catalina.out
awk數(shù)組操作秋泳,比如刪除數(shù)組的元素:
[jerry]$ awk 'BEGIN {
fruits["mango"]="yellow";
fruits["orange"]="orange";
delete fruits["orange"];
print fruits["orange"]
}'
awk的邏輯語言ifelse:
[jerry]$ awk 'BEGIN {
a=30;
if (a==10)
? print "a = 10";
else if (a == 20)
? print "a = 20";
else if (a == 30)
? print "a = 30";
}'
awk的循環(huán):
[jerry]$ awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'
[jerry]$ awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'
awk里面有很多內(nèi)置函數(shù)潦闲,數(shù)學(xué)函數(shù),字符串函數(shù)迫皱,日期函數(shù)等歉闰。
還可以自定義函數(shù)。
awk也可以把輸出重定向到文件:
[jerry]$ awk 'BEGIN { print "Hello, World !!!" > "/tmp/message.txt" }'
>> 雙大于號是追加。
awk也可以使用管道:
[jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'
聲明:本文轉(zhuǎn)載自蛙課網(wǎng)官網(wǎng)
想獲取更多資訊新娜、更多視頻赵辕、面試題答案,還有各種資源+源碼+工具
就關(guān)注“蛙課網(wǎng)懈帕洌”公眾號吧还惠!