1,654 瀏覽數

Linux command – awk 的輸出語法

透過 sed 與 awk 都可以把文件做過濾和轉換成新的輸出內容.不過 sedhttp://benjr.tw/97129 適合用於一整行的資料處理,而 awk 則比較適合將一整行做多個 欄位(Field) 的資料處理.先來看看 awk 的幾個範例.

# mawk  [-W  option]  [-F value] [-v var=value] [--] 'program text' [file...]

awk 是 mawk 的連結,兩種方式都可以下指令.

awk 要處理的資料來源可以是透過 | (pipe) , 或是檔案 .

root@ubuntu:~# cat /etc/passwd | awk '{print}'
root@ubuntu:~# awk '{print}' /etc/passwd

print

輸出格式 $0 ORS 到標準輸出 (預設為 terminal)

  • $0 則是代表 一整行的資料.
  • ORS 是內建的變數,他所代表的意思 terminates each record on output, 等同 = “\n” (newline)

下面這個範例跟 ll 輸出一樣.因為輸出格式為 $0 ORS ,字串沒有做任何處理.

root@ubuntu:~# ll | awk '{print}'
total 40
drwx------  5 root root 4096 Jul  2 23:50 ./
drwxr-xr-x 24 root root 4096 Jul  2 23:46 ../
-rw-------  1 root root 3672 Mar  2 03:27 .bash_history
-rw-r--r--  1 root root 3106 Oct 22  2015 .bashrc
drwx------  2 root root 4096 Jul 19  2016 .cache/
drwx------  3 root root 4096 Nov 16  2016 .gnupg/
-rw-------  1 root root   35 Jul  2 23:50 .lesshst
drwxr-xr-x  2 root root 4096 Nov 16  2016 .nano/
-rw-r--r--  1 root root  148 Aug 17  2015 .profile
-rw-------  1 root root  638 Dec 29  2016 .viminfo

print 後面不接參數,直接會用 $0 ORS 輸出到標準輸出.

root@ubuntu:~# ll | awk '{print}'

print expr1, expr2, …, exprn

輸出格式 expr1 OFS expr2 OFS … exprn ORS 到標準輸出 (預設為 terminal).

  • OFS 是內建的變數,他所代表的意思 inserted between fields on output, 等同 = ” “.

下面的範例是擷取 ll 的第 3 (Owner) 9(Filename) 欄資料並輸出到標準輸出 (預設為 terminal).$1 代表第一欄資料, $2 代表第二欄資料,以此類推.$0 則是代表 一整行的資料

root@ubuntu:~# ll | awk '{print $3,$9}'
 
root ./
root ../
root .bash_history
root .bashrc
root .cache/
root .gnupg/
root .lesshst
root .nano/
root .profile
root .viminfo

printf format, expr-list

簡單來說就是 printf 可以使用更多種格式 (ANSI C format) 輸出到標準輸出.可以使用的格式如下.

ANSI C format

  • %c char single character
  • %d (%i) int signed integer
  • %e (%E) float or double exponential format
  • %f float or double signed decimal
  • %g (%G) float or double use %f or %e as required
  • %o int unsigned octal value
  • %p pointer address stored in pointer
  • %s array of char sequence of characters
  • %u int unsigned decimal
  • %x (%X) int unsigned hex value

下面的範例是擷取 ll 的第 3 (Owner) 9(Filename) 欄資料並輸出到標準輸出 (預設為 terminal).$1 代表第一欄, $2 代表第二欄,以此類推.
下面範例使用 printf format, expr-list ,可以以更格式化的方式輸出資料.
%s 輸出字串,可以自訂長度.

root@ubuntu:~# ll | awk '{printf "%5s %10s\n",$3,$9 }' 
                
 root         ./
 root        ../
 root       1024
 root .bash_history
 root    .bashrc
 root   bash.sh*
 root    .cache/
 root dumpfile.sh*
 root  ens33.txt
 root    .gnupg/
 root   .lesshst
 root       log/
 root     .nano/
 root     passwd
 root    pay.txt
 root   .profile
 root pstres.txt
 root select.sh*
 root   .viminfo

剛剛有使用到 \n 他們是控制字元的 跳脫序列(Escape Sequences),可用的格式化輸出說明如下:
\\ – \
\” – ”
\a – alert, ascii 7
\b – backspace, ascii 8
\t – tab, ascii 9
\n – newline, ascii 10
\v – vertical tab, ascii 11
\f – formfeed, ascii 12
\r – carriage return, ascii 13
\ddd – 1, 2 or 3 octal digits for ascii ddd
\xhh – 1 or 2 hex digits for ascii hh

One Reply to “Linux command – awk 的輸出語法”

  1. 自動參照通知: Linux command – sed – Benjr.tw

發表迴響