透過 sed 與 awk 都可以把文件做過濾和轉換成新的輸出內容.不過 sed – https://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
輸出格式 $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