awk系列:如何讓awk使用 Shell 變量
當(dāng)我們編寫 shell 腳本時(shí),我們通常會(huì)在腳本中包含其它小程序或命令,例如 awk 操作。對(duì)于 awk 而言,我們需要找一些將某些值從 shell 傳遞到 awk 操作中的方法。
我們可以通過(guò)在 awk 命令中使用 shell 變量達(dá)到目的,在 awk 系列的這一節(jié)中,我們將學(xué)習(xí)如何讓 awk 使用 shell 變量,這些變量可能包含我們希望傳遞給 awk 命令的值。
有兩種可能的方法可以讓 awk 使用 shell 變量:
1. 使用 Shell 引用
讓我們用一個(gè)示例來(lái)演示如何在一條 awk 命令中使用 shell 引用來(lái)替代一個(gè) shell 變量。在該示例中,我們希望在文件 /etc/passwd 中搜索一個(gè)用戶名,過(guò)濾并輸出用戶的賬戶信息。
因此,我們可以編寫一個(gè) test.sh 腳本,內(nèi)容如下:
- #!/bin/bash
- ### 讀取用戶名
- read -p "請(qǐng)輸入用戶名:" username
- ### 在 /etc/passwd 中搜索用戶名,然后在屏幕上輸出詳細(xì)信息
- cat /etc/passwd | awk "/$username/ "' { print $0 }'
然后,保存文件并退出。
上述 test.sh 腳本中 awk 命令的說(shuō)明:
- cat /etc/passwd | awk "/$username/ "' { print $0 }'
"/$username/ ":該 shell 引用用于在 awk 命令中替換 shell 變量 username 的值。username 的值就是要在文件 /etc/passwd 中搜索的模式。
注意,雙引號(hào)位于 awk 腳本 '{ print $0 }' 之外。
接下來(lái)給腳本添加可執(zhí)行權(quán)限并運(yùn)行它,操作如下:
- $ chmod +x test.sh
- $ ./text.sh
運(yùn)行腳本后,它會(huì)提示你輸入一個(gè)用戶名,然后你輸入一個(gè)合法的用戶名并回車。你將會(huì)看到來(lái)自 /etc/passwd 文件中詳細(xì)的用戶賬戶信息,如下圖所示:
在 Password 文件中查找用戶名的 shell 腳本
2. 使用 awk 進(jìn)行變量賦值
和上面介紹的方法相比,該方法更加單,并且更好。考慮上面的示例,我們可以運(yùn)行一條簡(jiǎn)單的命令來(lái)完成同樣的任務(wù)。 在該方法中,我們使用 -v 選項(xiàng)將一個(gè) shell 變量的值賦給一個(gè) awk 變量。
首先,創(chuàng)建一個(gè) shell 變量 username,然后給它賦予一個(gè)我們希望在 /etc/passwd 文件中搜索的名稱。
- username="aaronkilik"
然后輸入下面的命令并回車:
- # cat /etc/passwd | awk -v name="$username" ' $0 ~ name {print $0}'
使用 awk 在 Password 文件中查找用戶名
上述命令的說(shuō)明:
- -v:awk 選項(xiàng)之一,用于聲明一個(gè)變量
- username:是 shell 變量
- name:是 awk 變量
讓我們仔細(xì)瞧瞧 awk 腳本 ' $0 ~ name {print $0}' 中的 $0 ~ name。還記得么,當(dāng)我們?cè)?awk 系列第四節(jié)中介紹 awk 比較運(yùn)算符時(shí),value ~ pattern 便是比較運(yùn)算符之一,它是指:如果 value 匹配了 pattern 則返回 true。
cat 命令通過(guò)管道傳給 awk 的 output($0) 與模式 (aaronkilik) 匹配,該模式即為我們?cè)?/etc/passwd 中搜索的名稱,***,比較操作返回 true。接下來(lái)會(huì)在屏幕上輸出包含用戶賬戶信息的行。
結(jié)論
我們已經(jīng)介紹了 awk 功能的一個(gè)重要部分,它能幫助我們?cè)?awk 命令中使用 shell 變量。很多時(shí)候,你都會(huì)在 shell 腳本中編寫小的 awk 程序或命令,因此,你需要清晰地理解如何在 awk 命令中使用 shell 變量。
在 awk 系列的下一個(gè)部分,我們將會(huì)深入學(xué)習(xí) awk 功能的另外一個(gè)關(guān)鍵部分,即流程控制語(yǔ)句。所以請(qǐng)繼續(xù)保持關(guān)注,并讓我們堅(jiān)持學(xué)習(xí)與分享。