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