awk也是一个非常棒的数据处理工具,相比于sed常用做一整行数据的处理,awk则比较倾向于把一行数据分成数个字段来处理。默认字段分隔符为空格键或tab键,$1表示第一字段,需要注意的是$0表示一行数据,与shell脚本里面表示脚本名不同。
awk命令格式为:awk '条件类型1{动作1} 条件类型2{动作2}...' filename
用命令last的到登录者信息 ,例如last -n 5得到
buptlsl pts/0 :0.0 Tue Feb 25 19:46 still logged in
buptlsl tty1 :0 Tue Feb 25 19:45 still logged in
reboot system boot 2.6.32-71.el6.i6 Tue Feb 25 19:42 - 20:23 (00:40)
buptlsl pts/0 :0.0 Mon Feb 24 20:44 - 22:47 (02:03)
buptlsl tty1 :0 Mon Feb 24 20:43 - 22:47 (02:03)
如果想取出登录者的帐号和IP,则可以使用awk命令
last -n 5 |awk '{print $1 "\t" $3}'
得到
buptlsl :0.0
buptlsl :0
reboot boot
buptlsl :0.0
buptlsl :0
ptint是awk最长使用的动作
awk有三个内置变量:NF,NR,FS;分别表示每一行拥有的字段总数,目前awk所处理的是第几行,目前的分隔字符(默认是空格键)。
举例来说,在/etc/passwd当中是以“:”作为字段分隔符的,第一字段为帐号,第三字段为UID,假设我们想取出第三列小于10的数据并且仅列出帐号与UID两列,该怎么办呢?
答案:
cat /etc/passwd |awk '{FS=":"} $3<10 {print $1 "\t" $3}'
显示正确,但是我们发现原文件中的第一行数据没有正确显示,这是为什么呢?原因是我们读入第一行数据时,还是以默认的空格键作为分隔符,虽然我们定义了FS=“:”作为分隔符,但是只能在第二行之后才能生效。那该怎么办呢?我们可以使用BEGIN预先设置awk的变量!也就是:
cat /etc/passwd |awk 'BEGIN {FS=":"} $3<10 {print $1 "\t" $3}'