awk系列:在awk中如何使用流程控制語句
當(dāng)你回顧所有到目前為止我們已經(jīng)覆蓋的 awk 實(shí)例,從 awk 系列的開始,你會(huì)注意到各種實(shí)例的所有指令是順序執(zhí)行的,即一個(gè)接一個(gè)地執(zhí)行。但在某些情況下,我們可能希望基于一些條件進(jìn)行文本過濾操作,即流程控制語句允許的那些語句。
在 awk 編程中有各種各樣的流程控制語句,其中包括:
- if-else 語句
- for 語句
- while 語句
- do-while 語句
- break 語句
- continue 語句
- next 語句
- nextfile 語句
- exit 語句
然而,對(duì)于本系列的這一部分,我們將闡述:if-else、for、while 和 do while 語句。請(qǐng)記住,我們已經(jīng)在這個(gè) awk 系列的第 6 部分介紹過如何使用 awk 的 next 語句。
1. if-else 語句
如你想的那樣。if 語句的語法類似于 shell 中的 if 語句:
- if (條件 1) {
- 動(dòng)作 1
- }
- else {
- 動(dòng)作 2
- }
在上述語法中,條件 1 和條件 2 是 awk 表達(dá)式,而動(dòng)作 1 和動(dòng)作 2 是當(dāng)各自的條件得到滿足時(shí)所執(zhí)行的 awk 命令。
當(dāng)條件 1 滿足時(shí),意味著它為真,那么動(dòng)作 1 被執(zhí)行并退出 if 語句,否則動(dòng)作 2 被執(zhí)行。
if 語句還能擴(kuò)展為如下的 if-else_if-else 語句:
- if (條件 1){
- 動(dòng)作 1
- }
- else if (條件 2){
- 動(dòng)作 2
- }
- else{
- 動(dòng)作 3
- }
對(duì)于上面的形式,如果條件 1 為真,那么動(dòng)作 1 被執(zhí)行并退出 if 語句,否則條件 2 被求值且如果值為真,那么動(dòng)作 2 被執(zhí)行并退出 if 語句。然而,當(dāng)條件 2 為假時(shí),那么動(dòng)作 3 被執(zhí)行并退出 if 語句。
這是在使用 if 語句的一個(gè)實(shí)例,我們有一個(gè)用戶和他們年齡的列表,存儲(chǔ)在文件 users.txt 中。
我們要打印一個(gè)清單,顯示用戶的名稱和用戶的年齡是否小于或超過 25 歲。
- aaronkilik@tecMint ~ $ cat users.txt
- Sarah L 35 F
- Aaron Kili 40 M
- John Doo 20 M
- Kili Seth 49 M
我們可以寫一個(gè)簡短的 shell 腳本來執(zhí)行上文中我們的工作,這是腳本的內(nèi)容:
- #!/bin/bash
- awk ' {
- if ( $3 <= 25 ){
- print "User",$1,$2,"is less than 25 years old." ;
- }
- else {
- print "User",$1,$2,"is more than 25 years old" ;
- }
- }' ~/users.txt
然后保存文件并退出,按如下方式使腳本可執(zhí)行并運(yùn)行它:
- $ chmod +x test.sh
- $ ./test.sh
輸出樣例
- User Sarah L is more than 25 years old
- User Aaron Kili is more than 25 years old
- User John Doo is less than 25 years old.
- User Kili Seth is more than 25 years old
2. for 語句
如果你想在一個(gè)循環(huán)中執(zhí)行一些 awk 命令,那么 for 語句為你提供一個(gè)做這個(gè)的合適方式,格式如下:
- for ( 計(jì)數(shù)器的初始化 ; 測(cè)試條件 ; 計(jì)數(shù)器增加 ){
- 動(dòng)作
- }
這里,該方法是通過一個(gè)計(jì)數(shù)器來控制循環(huán)執(zhí)行來定義的,首先你需要初始化這個(gè)計(jì)數(shù)器,然后針對(duì)測(cè)試條件運(yùn)行它,如果它為真,執(zhí)行這些動(dòng)作并最終增加這個(gè)計(jì)數(shù)器。當(dāng)計(jì)數(shù)器不滿足條件時(shí),循環(huán)終止。
在我們想要打印數(shù)字 0 到 10 時(shí),以下 awk 命令顯示 for 語句是如何工作的:
- $ awk 'BEGIN{ for(counter=0;counter<=10;counter++){ print counter} }'
輸出樣例
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
3. while 語句
while 語句的傳統(tǒng)語法如下:
- while ( 條件 ) {
- 動(dòng)作
- }
這個(gè)條件是一個(gè) awk 表達(dá)式而動(dòng)作是當(dāng)條件為真時(shí)被執(zhí)行的 awk 命令。
下面是一個(gè)說明使用 while 語句來打印數(shù)字 0 到 10 的腳本:
- #!/bin/bash
- awk ' BEGIN{ counter=0;
- while(counter<=10){
- print counter;
- counter+=1;
- }
- }'
保存文件并使腳本可執(zhí)行,然后運(yùn)行它:
- $ chmod +x test.sh
- $ ./test.sh
輸出樣例
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
4. do while 語句
它是上文中 while 語句的一個(gè)變型,具有以下語法:
- do {
- 動(dòng)作
- }
- while (條件)
這輕微的區(qū)別在于,在 do while 語句下,awk 的命令在求值條件之前執(zhí)行。使用上文 while 語句的例子,我們可以通過按如下所述修改 test.sh 腳本中的 awk 命令來說明 do while 語句的用法:
- #!/bin/bash
- awk ' BEGIN{ counter=0;
- do{
- print counter;
- counter+=1;
- }
- while (counter<=10)
- }'
修改腳本之后,保存文件并退出。按如下方式使腳本可執(zhí)行并執(zhí)行它:
- $ chmod +x test.sh
- $ ./test.sh
輸出樣例
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
總結(jié)
這不是關(guān)于 awk 的流程控制語句的一個(gè)全面的指南,正如我早先提到的,在 awk 里還有其他幾個(gè)流程控制語句。
盡管如此,awk 系列的這一部分使應(yīng)該你明白了一個(gè)明確的基于某些條件控制的 awk 命令是如何執(zhí)行的基本概念。
你還可以了解其余更多的流程控制語句以獲得更多關(guān)于該主題的理解。***,在 awk 的系列下一節(jié),我們將進(jìn)入編寫 awk 腳本。