使用一句话过滤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地址。