awk是一个非常好用的数据处理工具。相较于sed常常一整行处理,awk则比较倾向于一行当中分成数个“字段”处理,awk处理方式如下: $awk'条件类型1{动作1} 条件类型2{动作2} ...'filename
1.查看最近5条登录用户和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代表整行
变量名称代表意义
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/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
统计数据例子:
$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