Linux命令之awk

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}'


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值