Awk 入門/Shell 指令碼中 Awk 的使用
外觀
< Awk 入門
Awk 是構建 UNIX/Linux shell 指令碼的絕佳工具,但存在潛在的陷阱。假設我們有一個名為“testscript”的指令碼檔案,它接受兩個檔名作為引數
testscript myfile1 myfile2
如果我們從檔案中執行 Awk 命令,處理這兩個檔名並不困難。我們可以在命令列上初始化變數,如下所示
cat $1 $2 | awk -f testscript.awk f1=$1 f2=$2 > tmpfile
Awk 程式將使用兩個變數“f1”和“f2”,它們從指令碼命令列變數“$1”和“$2”初始化。
當我們直接指定 Awk 命令時,這種方法會變得很麻煩,如果可能,直接指定 Awk 命令是首選的,因為它可以減少實現指令碼所需的 檔案數量。問題是“$1”和“$2”在指令碼檔案和 Awk 中的含義不同。對於指令碼檔案,它們是命令列引數,但對於 Awk,它們表示輸入中的文字欄位。
這些變數的處理方式取決於 Awk 列印欄位的定義方式 - 用雙引號 (“ ”) 還是單引號 (' ') 括起來。如果我們像這樣呼叫 Awk
awk "{ print \"This is a test: \" $1 }" $1
— 我們將不會為“$1”變數打印出任何內容。如果我們改用單引號以確保指令碼檔案不對 Awk 位置變數進行任何操作,我們可以透過將它們初始化為命令列上的變數來插入指令碼檔案變數
awk '{ print "This is a test: " $1 " / parm2 = " f }' f=$2 < $1
這將“myfile1”中的第一個欄位作為第一個引數,並將“myfile2”的名稱作為第二個引數。
請記住,Awk 速度相對較慢且笨拙,不應被視為所有指令碼檔案工作的預設工具。我們可以使用“cat”將內容追加到檔案,使用“head”和“tail”從檔案開頭或結尾擷取一定數量的行,使用“grep”或“fgrep”在特定檔案中查詢行,以及使用“sed”對檔案中的流進行搜尋替換。