961 瀏覽數

Linux command – awk 參數

透過 sed 與 awk 都可以把文件做過濾和轉換成新的輸出內容.不過 sedhttp://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 的程式結構 請參考 http://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.

發表迴響