awk是一個(gè)非常好用的數(shù)據(jù)處理工具鉴分。相較于sed常常一整行處理酌予,awk則比較傾向于一行當(dāng)中分成數(shù)個(gè)“字段”處理恳啥,awk處理方式如下:? ?$awk'條件類(lèi)型1{動(dòng)作1} 條件類(lèi)型2{動(dòng)作2} ...'filename
1.查看最近5條登錄用戶(hù)和ip地址
$last-n5|awk'{print $1"\t"$3}'lzyer 192.168.56.1reboot boot
lzyer? ? 192.168.56.1reboot? ? boot
lzyer? ? 192.168.56.1? ?
wtmp? ? Sat
注意:$0代表整行
變量名稱(chēng)代表意義
NF每一行($0)擁有字段總數(shù)
NR目前awk處理的第幾行
FS目前分隔符查描,默認(rèn)是空白
awk的邏輯運(yùn)算
運(yùn)算單元? ? ? 代表意義
>? ? ? ? ? ? ? ? ? ?大于
<? ? ? ? ? ? ? ? ? ?小于
>=? ? ? ? ? ? ? ? ?大于等于
<=? ? ? ? ? ? ? ? ?小于等于
==? ? ? ? ? ? ? ? ?等于
!=? ? ? ? ? ? ? ? ? 不等于
值得注意的是那個(gè)“ == ”的符號(hào)宵蛀,因?yàn)椋?/b>
邏輯運(yùn)算上面亦即所謂的大于痴鳄、小于瘟斜、等于等判斷式上面,習(xí)慣上是以“ == ”來(lái)表示痪寻;
如果是直接給予一個(gè)值螺句,例如變量設(shè)置時(shí),就直接使用 = 而已橡类。
舉例來(lái)說(shuō)蛇尚,在 /etc/passwd 當(dāng)中是以冒號(hào) ":" 來(lái)作為字段的分隔, 該文件中第一字段為帳號(hào)顾画,第三字段則是 UID取劫。那假設(shè)我要查閱,第三欄小于 10 以下的數(shù)據(jù)研侣,并且僅列出帳號(hào)與第三欄谱邪, 那么可以這樣做:
$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/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown: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
統(tǒng)計(jì)數(shù)據(jù)例子:
$cat pay.txt
Name? ? 1st? ? 2nd? ? 3th
VBird? 230002400025000DMTsai? 210002000023000Bird2? 430004200041000
$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? ? ? 23000240002500072000.00? ??
? ? DMTsai? ? ? 21000200002300064000.00? ??
? ? Bird2? ? ? 430004200041000126000.00