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