如何使用 awk 呼叫外部程式
簡介
Awk 是一種強大的文字處理工具,可用於自動化各種任務,例如資料操作、過濾和報告。Awk 的一個有趣功能是它能夠在指令碼中呼叫外部程式。在本文中,我們將探討如何使用 awk 呼叫外部程式。
瞭解 system() 函式
system() 函式用於在 awk 內部執行外部命令。system() 函式的語法如下:
system(command)
command 引數是要執行的外部命令。當執行 system() 函式時,awk 將 command 引數傳遞給 shell 以執行。然後 shell 執行命令並將退出狀態返回給 awk。
呼叫外部程式
要使用 awk 呼叫外部程式,我們需要將要執行的命令指定為 system() 函式的引數。例如,假設我們想在 awk 指令碼中執行 date 命令。我們可以按如下方式執行:
{
system("date")
}
在此示例中,我們使用 system() 函式呼叫 date 命令。當執行指令碼時,將執行 date 命令,並在螢幕上顯示當前日期和時間。
將輸入傳遞給外部程式
我們可以使用 system() 函式將輸入傳遞給外部程式。例如,假設我們想使用 sort 命令對數字列表進行排序。我們可以按如下方式執行:
{
print "3
1
2" | "sort"
}
在此示例中,我們使用 print 語句生成一個數字列表(3、1、2)。然後我們使用管道符號(|)將此數字列表作為輸入傳遞給 sort 命令。然後 sort 命令對數字進行排序並將結果返回給 awk。
儲存外部程式的輸出
我們可以使用 getline() 函式將外部程式的輸出儲存在變數中。getline() 函式用於從檔案或命令讀取一行輸入。我們可以使用 getline() 函式捕獲外部程式的輸出。例如,假設我們想將 ls 命令的輸出捕獲到一個變數中。我們可以按如下方式執行:
{
"ls" | getline output
print output
}
在此示例中,我們使用 system() 函式執行 ls 命令。然後我們使用 getline() 函式將 ls 命令的輸出捕獲到 output 變數中。最後,我們使用 print 語句顯示 ls 命令的輸出。
將引數傳遞給外部程式
我們可以使用 system() 函式將引數傳遞給外部程式。例如,假設我們想使用 tr 命令將字串轉換為大寫。我們可以按如下方式執行:
{
str = "hello world"
cmd = "echo " str " | tr '[:lower:]' '[:upper:]'"
cmd | getline output
print output
}
在此示例中,我們使用 echo 命令將字串“hello world”作為輸入傳遞給 tr 命令。然後我們使用 tr 命令將字串轉換為大寫。最後,我們使用 getline() 函式將 tr 命令的輸出捕獲到 output 變數中。
處理錯誤
使用 awk 呼叫外部程式時,務必處理執行過程中可能發生的錯誤。我們可以使用 system() 函式檢查外部程式的退出狀態。退出狀態是一個數字,指示命令的成功或失敗。值為零表示成功,非零值表示失敗。
例如,假設我們想使用 test 命令檢查檔案是否存在。我們可以按如下方式執行:
{
file = "myfile.txt"
cmd = "test -e " file
if (system(cmd) != 0) {
print "File does not exist"
} else {
print "File exists"
}
}
在此示例中,我們使用 test 命令檢查檔案“myfile.txt”是否存在。然後我們使用 system() 函式執行 test 命令。如果 test 命令的退出狀態為非零,則列印“檔案不存在”。否則,列印“檔案存在”。
高階示例
過濾外部程式的輸出我們可以使用 awk 過濾外部程式的輸出。例如,假設我們想僅顯示 ps 命令輸出的第一行。我們可以按如下方式執行:
{
cmd = "ps"
cmd | getline output
close(cmd)
split(output, lines, "
")
print lines[1]
}
在此示例中,我們使用 getline() 函式將 ps 命令的輸出捕獲到 output 變數中。然後我們使用 split() 函式將輸出拆分為一個行陣列。最後,我們使用 print 語句顯示輸出的第一行。
在外部命令中使用 awk 變數我們可以將 awk 變數用於外部命令。例如,假設我們想使用 touch 命令建立一個名稱基於變數的檔案。我們可以按如下方式執行:
{
filename = "myfile.txt"
cmd = "touch " filename
system(cmd)
}
在此示例中,我們在 touch 命令中使用 filename 變數來建立一個名為“myfile.txt”的檔案。
使用 awk 格式化外部程式的輸出我們可以使用 awk 格式化外部程式的輸出。例如,假設我們想以更易讀的格式顯示 df 命令的輸出。我們可以按如下方式執行:
{
cmd = "df -h"
cmd | getline output
close(cmd)
printf "%-20s%-10s%-10s%-10s%-10s%s
", "Filesystem", "Size", "Used", "Avail", "Use%",
"Mounted on"
split(output, lines, "
")
for (i=2; i<=length(lines); i++) {
printf "%-20s%-10s%-10s%-10s%-10s%s
", $1, $2, $3, $4, $5, $6
}
}
在此示例中,我們使用 printf 語句格式化 df 命令的輸出。我們列印一個帶有列標題的標題行,然後列印 df 命令的輸出,其中每列都對齊到固定寬度。
結論
在本文中,我們探討了如何使用 awk 呼叫外部程式。我們瞭解瞭如何將輸入傳遞給外部程式、捕獲外部程式的輸出以及處理執行過程中可能發生的錯誤。透過使用 awk 呼叫外部程式的功能,我們可以自動化各種任務,使我們的指令碼更強大、更靈活。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP