awk是一個非常好用的數據處理工具。相較於sed常常一整行處理,awk則比較傾向於一行當中分成數個“字段”處理,awk處理方式如下:
$ awk '條件類型1{動作1} 條件類型2{動作2} ...' filename
1.查看最近5條登錄用戶和ip地址
$ last -n 5|awk '{print $1"\t"$3}' lzyer 192.168.56.1 reboot boot lzyer 192.168.56.1 reboot boot lzyer 192.168.56.1 wtmp Sat
注意:$0代表整行
變量名稱 | 代表意義 |
NF | 每一行($0)擁有字段總數 |
NR | 目前awk處理的第幾行 |
FS | 目前分隔符,默認是空白 |
awk的邏輯運算
運算單元 | 代表意義 |
> | 大於 |
< | 小於 |
>= | 大於等於 |
<= | 小於等於 |
== | 等於 |
!= | 不等於 |
值得注意的是那個“ == ”的符號,因為:
- 邏輯運算上面亦即所謂的大於、小於、等於等判斷式上面,習慣上是以“ == ”來表示;
- 如果是直接給予一個值,例如變量設置時,就直接使用 = 而已。
舉例來說,在 /etc/passwd 當中是以冒號 ":" 來作為字段的分隔, 該文件中第一字段為帳號,第三字段則是 UID。那假設我要查閱,第三欄小於 10 以下的數據,並且僅列出帳號與第三欄, 那么可以這樣做:
$ cat /etc/passwd|awk '{FS=":"} $3<10 {print $0}' root:x:0:0:root:/root:/bin/zsh bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
統計數據例子:
$ cat pay.txt Name 1st 2nd 3th VBird 23000 24000 25000 DMTsai 21000 20000 23000 Bird2 43000 42000 41000
$ cat pay.txt|awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} \ NR>=2{total=$2+$3+$4 > printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}' Name 1st 2nd 3th Total VBird 23000 24000 25000 72000.00 DMTsai 21000 20000 23000 64000.00 Bird2 43000 42000 41000 126000.00