5分鐘入門AWK

AWK是Linux上卓越的文本處理工具,它具有非常簡(jiǎn)單的語法結(jié)構(gòu),擁有強(qiáng)大的文本處理能力。AWK 是一種解釋執(zhí)行的編程語言,AWK 的名稱是由它們?cè)O(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)用場(chǎ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í)行后會(huì)生成一個(gè) Makefile 文件。 接下來使用 make 命令編譯源代碼。
[jerry]$ make
step 5——你可以運(yùn)行測(cè)試工具保證 build 是干凈的。 這一步是可選的。
[jerry]$ make check
step 6——最后一步,安裝 AWK。 安裝前請(qǐng)確認(rèn)你有超級(jí)用戶的權(quán)限。
[jerry]$ sudo make install
通過以上六個(gè)步驟,你就成功地編譯并安裝了 AWK。 你可以通過如下的命令來確認(rèn) awk 安裝成功:
?
gawk的版本通過: gawk --version 查看
[jerry]$ which awk
執(zhí)行上面的命令,你將會(huì)得到如下的結(jié)果:
/usr/bin/awk
?
awk的工作流程:
讀( Read )、執(zhí) 行( Execute )與重復(fù)( Repeat )
讀入一行執(zhí)行一行,直到文件末尾。
?
gawk的程序結(jié)構(gòu):
開始?jí)K(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?
其中單引號(hào)是為了和shell命令區(qū)分開;
/pattern/ 是一個(gè)過濾器,匹配這個(gè)模式的行才會(huì)被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)會(huì)將全局變量及相應(yīng)值按序輸出到指定文件中。默認(rèn)的輸出文件名是 awkvars.out。
[jerry]$ awk --dump-variables ''
[jerry]$ cat awkvars.out?
?
awk的基本使用示例:
默認(rèn)情況下,如果某行與模式串匹配,AWK 會(huì)將整行輸出:
[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" }'
>> 雙大于號(hào)是追加。
awk也可以使用管道:
[jerry]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'