awk连载2:awk的操作符
前面讲了,awk在一行内容里先匹配是否含有某关键字,然后再决定要不要对此行进行相关操作,awk ‘/关键字/{print $n}’。但是如果想判断,某个字段(awk对行进行分段)是否含有某个关键字,或者是否满足某个正则表达式表示的意思,才会进行相关操作。
==和!=操作符的用法
awk ‘$N == “字符”{print操作}’ file
注意这里要找的字符要用双引号引起来,意思是只有第N部分的值等于指定的字符才会打印:
比如如下文件
[root@vms63 ~]# cat aa.txt
aaa 1 root 11111
bbb 2 ro2t 222 ddd aaa
ccc 3 xxxx r22t dddd
ddd 4 yyy root 222
eee 5 aaa zzz
要求,首先找到第3部分是root的行,然后打印第1部分的值,命令如下:
只有第一行的第三部分是root,所以才会满足
如果表示不等于的话,则用!= ,比如找到第三部分不是root的,才执行命令:
~的用法
awk ‘$N~ /正则/{print操作}’ file
或者
awk ‘$N~”正则”{print操作}’ file
练习:在aa.txt里找到第3部分满足 首字母是r,第二个是字母的,第三个无所谓,第四个字符是t的行,然后打印$1 :
或者
> 及<操作符的使用
用法如下:awk ‘$N>数值{print操作}’ file
练习:在aa.txt里找出 第二部分小于3 的那些行,然后打印第一部分:
注:还有 >= 、 <=等其他操作符
上面的都是指定了一个条件,如果想使用多个条件的话,可以用&&或者||作为连接符:
条件1 && 条件2 要两个条件全部满足
条件1 || 条件2 只要满足一个条件即可
练习:找到第3部分满足:第一个字符是r,第二个是字母,第三个是数字的,最后为t的行,且第2部分大于等于2的行,然后打印第一部分:
练习1:找出uid是65534的用户名,并且以:
用户名:uid:gid 格式来显示
答案:
练习2:如下虚拟机的配置如下:
[root@server2 ~]# virsh domiflist director
接口 类型 源 型号 MAC
-------------------------------------------------------
vnet0 network external virtio 52:54:00:d0:75:a2
vnet1 network pri virtio 52:54:00:e3:10:25
[root@server2 ~]#
现在想截取网络使用pri的网卡的ma地址: