如何使用 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 呼叫外部程式的功能,我們可以自動化各種任務,使我們的指令碼更強大、更靈活。

更新於:2023-03-24

624 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.