awk 过滤ip地址的理解(根据老男孩老师的blog分析)
老男孩老师的博文:http://oldboy.blog.51cto.com/2561410/950730
方法一【此法为绿叶】:如果用awk来处理的话,一般的同学可能会用下面的办法实现:
[root@oldboy ~]# ifconfig eth0|grep 'inet addr'|awk -F ":" '{print $2}'|awk '{print $1}'
10.0.0.162
我的分析:
1、需要写全inet addr,不然会出现2个。
2、awk -F 是过滤关键字段,’:‘ 与: 从结果是来说是一样的,但是’:‘
比较规范。
[root@lzt-Exam ~]# ifconfig eth0 |grep 'inet addr'|awk -F : '{ print $2}'|awk '{ print $1}'
192.168.0.81
[root@lzt-Exam ~]# ifconfig eth0 |grep 'inet addr'|awk -F ':' '{ print $2}'|awk '{ print $1}'
192.168.0.81
这样的结果是:
[root@lzt-Exam ~]# ifconfig eth0 |grep 'inet addr'|awk -F : '{ print $2}'
192.168.0.81 Bcast 后面吧Bcast过滤掉。后面这个awk '{ print $1 }' 里面{ } 里面有个空格。没有空格会报格式错误的。
这里面有一个隐藏的awk过滤的问题,awk 默认过滤的是空格。后面的awk ‘{ print $1 }’便是很好的说明。
[root@lzt-Exam ~]# ifconfig eth0|grep 'inet addr'|awk -F ':' '{ print $2 }'
192.168.0.81 Bcast
后面在加一个awk ‘{ print $1 }’这样便把ip给过滤出来。
方法二【此法为小红花】:通过awk同时使用多个分隔符来实现:
[root@oldboy ~]# ifconfig eth0|grep 'inet addr'|awk -F '[ :]' '{print $13}'
192.168.1.186
提示:本题通过使用空格或冒号来做分隔符,然后一次性取出结果,就是空格或冒号可以看做是同一个分隔符
这个方法是以空格和:为过滤的字段进行第一步过滤。
[root@lzt-Exam ~]# ifconfig eth0|grep 'inet addr'
inet addr:192.168.0.82 Bcast:192.168.0.255 Mask:255.255.255.0
从头开始数空格到i那是10个,然后t后是11,addr后面的冒号是12,82后面是13
小结:这个方法很方便吧,同学们可以多用,选取包含IP地址行的特殊关键字'inet addr’过滤然后,使用awk以空格和:同时做分隔符,然后取出需要的内容。
本答案的最大缺点就是计算$n的时候很费劲,因为inet前面有多个空格,查到$13,真是不容易,如此看来从实现时间上可能还不如第一个方法快呢?那好引出我们今天的关键答案案例。
方法三【大红花出场】:通过awk同时使用多个分隔符,然后通过正则匹配多个分隔符的方法来实现:
[root@oldboy ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}'
10.0.0.185
我们来说明下这个简单易用的好办法:
提示:本题NR是行号,分隔符+号匹配,[]里一个或多个任意一个分隔符,这里就是匹配一个或多个冒号或空格。
1)awk -F 后面跟分隔符‘[空格:]+’,其中[空格:]多分隔符写法,意思是以空格或冒号做分隔,后面的"+"号是正则表达式,意思是匹配前面空格或冒号,两者之一的1个或1个以上。
2)NR==2和sed -n "2p",相当,意思都是选择第几行,例:
[root@oldboy ~]# ifconfig eth0|awk NR==2
inet addr:10.0.0.185 Bcast:10.0.0.255 Mask:255.255.255.0
3)指定awk -F '[ :]+'分隔符后,不同字符串被分隔的列依次为:
|
inet |
addr |
10.0.0.185 |
Bcast:10.0.0.255 Mask:255.255.255.0 |
第一列 |
第二列 |
第三列 |
第四列 |
后面忽略不计。 |
4)整个答案awk部分意思是,通过NR==2取出第二行,然后,通过-F '[-:]+多分隔符正则匹配,然后通过{print $4}打印出第四列 !谢谢杨瑞同学的答案啊, 懒得写了,所以让你总结下。嘿嘿,看到后别怪老师啊。
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $0 }'
---0:---1:---2:---3:---4 全部输出
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $1 }'
---0
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $2 }'
---1
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $3 }'
---2
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $4 }'
---3
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $5 }'
---4
[root@lzt-Exam ~]# echo ---0:---1:---2:---3:---4|awk -F '[ :]+' '{ print $6 }'
[root@lzt-Exam ~]#
[root@lzt-Exam ~]# echo ---1:----2|awk -F '[-:]+' '{print $2}'
1 $2是第一个参数
[root@lzt-Exam ~]# echo ---1:----2|awk -F '[-:]+' '{print $1}'
这个$1应该是echo后面的空格
[root@lzt-Exam ~]# echo ---1:----2|awk -F '[-:]+' '{print $0}'
---1:----2 $0全部输出
[root@lzt-Exam ~]# echo ---1:----2|awk -F '[-:]+' '{print $3}'
2 $3 是第二个参数
[root@lzt-Exam ~]#
本文出自 “lzt417” 博客,谢绝转载!