awk


相對於 sed 是以行為單位處理文字,awk 還可以用〝欄〞(Field)來處理文字。

如把 ls -l 的輸出經管線到 awk 寫成 ls -l | awk {},對 awk 來說毎一欄位會自動儲存在其預設的欄位變數〝$0〞,〝$1〞~〝$N〞(N 為欄位數)。

因 awk 用在指令其間的參數和敘述可能很抽象和複雜,awk 可能會無法判讀,故一般除檔案和選項以外的參數都會用單引號「'」把其括起來而寫成 ls -l | awk '{}'。

$ export TIME_STYLE=long-iso ←設時間格式(不同環境設定會影響〝ls -l〞的輸出格式)
$ ls -l
drwxr-xy-x     2     aaa     aaa     4096     2011-09-07     11:44     Desktop 
drwxr-xy-x     2     aaa     aaa     4096     2011-09-07     11:44     Documents 
drwxr-xy-x     2     aaa     aaa     4096     2011-09-07     11:44     Music 
drwxr-xy-x     2     aaa     aaa     4096     2011-09-07     11:44     Pictures 
drwxr-xy-x     2     aaa     aaa     4096     2011-09-07     11:44     Public 
↑     ↑     ↑     ↑     ↑     ↑     ↑     ↑ 
$1     $2     $3     $4     $5     $6     $7     $8 ←欄位變數

ls | awk '{ print $1 } ' ,看要輸出那個字串,

ls -l | awk '{ print $5,$8}' ,只輸出5和8的欄位資料

變數 內容
$0 drwxr-xy-x 2 aaa aaa 4096 2011-09-07 11:44 Desktop
$1 drwxr-xy-x
$2 2
$3 aaa
$4 aaa
$5 4096
$6 2011-09-07
$7 11:44
$8 Desktop

可以改變輸出模式

$ awk 'BEGIN {print "hello","awk"}' ←print 內的逗號〝,〞代表一個輸出欄位間隔,預設為空白
hello awk
$ awk 'BEGIN {OFS="<-->";print "hello","awk"}' ←更改輸出欄位間隔為〝<-->〞(輸出欄位間隔的內建變數為〝OFS〞)
hello<-->awk

results matching ""

    No results matching ""