透過 sed 與 awk 都可以把文件做過濾和轉換成新的輸出內容.不過 sed – https://benjr.tw/97129 適合用於一整行的資料處理,而 awk 則比較適合將一整行做多個 欄位 的資料處理.先來看看 awk 的幾個範例.
# mawk [-W option] [-F value] [-v var=value] [--] 'program text' [file...]
awk 是 mawk 的連結,兩種方式都可以下指令.
awk 提供的參數 (OPTIONS)
-F value
設定 FS (field separator) 這是 awk 的內建變數,預設的欄位區分是以 空白或是 tab 做分隔,要改成其他如 冒號 “:” 來作欄位的分隔時就需要設定 FS 變數.
下面例子直接使用參數 -F 來定義 FS
root@ubuntu:~# awk -F ":" '{print "User:\t"$1}' /etc/passwd User: root User: daemon User: bin User: sys User: sync User: games User: man
-F “:” 作用同 BEGIN{FS=”:”} (關於 awk 的程式結構 請參考 https://benjr.tw/97423 )
root@ubuntu:~# awk 'BEGIN{FS=":"} {print "User:\t"$1}' /etc/passwd User: root User: daemon User: bin User: sys User: sync User: games User: man
-f file
awk 的程式語言可以直接寫在一個檔案,要使用時只要使用參數 -f 來指定即可.
下面的範例使用了 awk 程式用來找出看誰沒設帳號密碼,awk 程式結構可大約區分三大塊:
[BEGIN { statement }] [{main}] [END{ statement }]
root@ubuntu:~# vi nopasswd.awk BEGIN { FS=":" total=0 } { if ( $2 == "" ) { print $1 ": no password" total ++ } } END { print "Total no password account=",total}
BEGIN {} 資料讀取前執行.
FS=”:” (Fields splits) 資料處理自訂欄位的分隔為 “:”.
total=0 定義變數 total
$2 代表第二欄資料
END {} 當資料都讀完處理完畢才會去執行.
root@ubuntu:~# awk -f nopasswd.awk /etc/passwd Ben: no password Total no password account= 1
-v var=value
這個參數用於設定變數.
前面的例子 awk 程式有設定一個變數 total ,我們也可以直接透過 awk 的參數來設定變數.
root@ubuntu:~# vi nopasswd.awk BEGIN { FS=":" } { if ( $2 == "" ) { print $1 ": no password" total ++ } } END { print "Total no password account=",total}
root@ubuntu:~# awk -f nopasswd.awk -v total=0 /etc/passwd Ben: no password Total no password account= 1
其他參數:
—
indicates the unambiguous end of options.
-W version
mawk writes its version and copyright to stdout and compiled limits to stderr and exits 0.
-W dump
writes an assembler like listing of the internal representation of the program to stdout and exits 0 (on successful compilation).
-W interactive
sets unbuffered writes to stdout and line buffered reads from stdin. Records from stdin are lines regardless of the value of RS.
-W exec file
Program text is read from file and this is the last option. Useful on systems that support the #! “magic number” convention for executable scripts.
-W sprintf=num
adjusts the size of mawk’s internal sprintf buffer to num bytes. More than rare use of this option indicates mawk should be recompiled.
-W posix_space
forces mawk not to consider ‘\n’ to be space.