使用一句话过滤ifconfig后准确的ip地址,此题在面试中经常出现,而且在日常工作中也会经常碰到。
首先查看ifconfig后的结果:
[root@client ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:25:EC:7C inet addr:192.168.1.232 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe25:ec7c/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:67069 errors:0 dropped:0 overruns:0 frame:0 TX packets:3579 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:10419737 (9.9 MiB) TX bytes:371133 (362.4 KiB) Interrupt:67 Base address:0x2000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:1655 errors:0 dropped:0 overruns:0 frame:0 TX packets:1655 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2885384 (2.7 MiB) TX bytes:2885384 (2.7 MiB)
我们要过滤出来的只有192.168.1.232,其他的都不用关注。可以使用awk,sed。grep等工具来实现。
方法一:使用grep和awk组合
[root@client ~]# ifconfig eth0| grep 'inet addr'| awk -F ":" '{print $2}'|awk '{print $1}' 192.168.1.232
分析:
1.使用grep 过滤出包含 inet addr的行,也就是ifconfig结果,注意这里要写全是inet addr,而不能简单的写inet,第三行中也包含inet,如果只写inet会将第三行也过滤出来,如下面例子:
[root@client ~]# ifconfig eth0| grep 'inet' inet addr:192.168.1.232 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe25:ec7c/64 Scope:Link
2.awk -F ":" ‘{print $2}’,这里是将我们刚才grep过滤出来的信息交给awk来处理,首先我们设定分隔符,这里我们使用“:“作为分隔符比较容易过滤。使用:做分隔符,那么我们所需要的IP地址就在第二个域中,那我们将第二个域打印出来
[root@client ~]# ifconfig eth0| grep 'inet addr'|awk -F ":" '{print $2}' 192.168.1.232 Bcast
从结果看,好像离我们想要的结果不远了哦。只是还多一个Bcast,这个东西得想办法去掉,很简单,再来个awk过滤一下就可以了。
3.awk '{print $1}',这句话就是直接打印第一个域,使用的是空格作为分隔符,这里注意:awk默认是使用空格来作为分隔符的。
[root@client ~]# ifconfig eth0| grep 'inet addr'|awk -F ":" '{print $2}'|awk '{print $1}' 192.168.1.232
好了,结果已经出来了,这就是我们所需要的最后结果。
方法二:使用sed和awk组合
[root@client ~]# ifconfig eth0|sed -n '2p'|awk -F ":" '{print $2}'|awk '{print $1}' 192.168.1.232
分析:其实跟第一种方法相差无几,只是把grep部分换成了sed,这种方法个人比较习惯,其实最简单一点就是,我不用去一定记住第二行开始的是inet addr这部分,我只用sed取出第二行就可以了
这里sed -n '2p'是直接打印出第二行所有内容
[root@client ~]# ifconfig eth0|sed -n '2p' inet addr:192.168.1.232 Bcast:192.168.1.255 Mask:255.255.255.0
第二行的内容打印出来,那后面的操作跟方法一的一样就可以了哦。
方法三:使用正则匹配
[root@www ~]# ifconfig eth0|sed -n 's/^.*addr:\(.\{7,15\}\) Bca.*$/\1/gp' 192.168.0.250
我们这里重点分析sed部分,首先sed -n 's///gp'这个基本框架就不细说了,这里要说明一下替换部分中的\1,这里是匹配被替换部分中的第一个()中的内容。
/^.*addr:\(.\{7,15\}\) Bca.*$/这里细说一下这里的具体匹配,这里使用的就是正则表达式的方法。
首先^.*addr:这句话的意思是:匹配以0个或多个任意字符开头,以addr:结束。也就是相当于匹配 inet addr:192.168.0.250 Bcast:192.168.0.255 Mask:255.255.255.0这句话中×××底彩的部分。
接下来,\(.\{7,15\}\)这句话的分析:其中\是转义字符,这里不多说。()中的.代表的是任意字符,那么后边的{7,15}是重复前面字符7-15次,也就是我们的IP地址,为什么是7-15呢?比如我们的地址是1.1.1.1那么数一数吧,是不是7个字符,呵呵!同理,如果是192.168.111.123,那么数一下,是不是15了呢。这里匹配的就是192.168.0.250这里喽。
最后一部分, Bca.*$分析:前面是两个空格,然后接Bca后边模糊匹配,表示以两个空格加Bca开始,以任意字符结尾的部分。 inet addr:192.168.0.250 Bcast:192.168.0.255 Mask:255.255.255.0
就是×××部分喽。将这些都过滤完成之后,我们替换部分是\1,前面已经说了,是匹配被替换部分中的第一个()中的内容,也就是我们的IP地址。