问题

  一同事的朋友正在参加笔试,遇到这么一个问题让他帮忙解决,结果同事又找到我帮他搞定。真是感慨:通讯发达在某些方面来说,真不知是不是好事啊!题目大致如下所示,一般我们使用ifconfig查看网卡信息,请问你可以通过什么命令,让其只输出IP地址192.168.42.128

1610803417978.png

实现

看似简单的问题,实现起来也不是太简单。看看下面的思路吧

  1. [root@linux ~]# ip addr
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  4. inet 127.0.0.1/8 scope host lo
  5. valid_lft forever preferred_lft forever
  6. inet6 ::1/128 scope host
  7. valid_lft forever preferred_lft forever
  8. 2: enp7s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
  9. link/ether dc:0e:a1:e5:8e:90 brd ff:ff:ff:ff:ff:ff
  10. 3: wlp8s0b1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
  11. link/ether 08:ed:b9:48:61:72 brd ff:ff:ff:ff:ff:ff
  12. inet 192.168.1.252/24 brd 192.168.1.255 scope global noprefixroute wlp8s0b1
  13. valid_lft forever preferred_lft forever
  14. inet6 fe80::9aae:a019:821:b57a/64 scope link noprefixroute
  15. valid_lft forever preferred_lft forever
  16. 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default

1610803418003.png

到这一步非常简单,接下来就需要借助sed来实现了,如下所示,到此问题解决。

  1. 删除ip地址左侧字符串

1610803418029.png

  1. 用命令 “|sed ‘s#/24.*$##g’”去除IP地址后面的内容:

1610803418079.png

注意:如果遇到了要过滤“/”,所以我们就不再用“s///g”命令了,用“s###g”代替,而功能上是一样的,除此之外,我们还能用“s:::g”代替。

  1. 删除ingt6所在的一行

1610803418079.png

  1. 删除纯空行和由空格组成的空行

1610803418106.png

  1. ifconfig wlp8s0b1 | grep "inet" | sed 's/^.*inet //g' | sed 's#netmask .*$##g' | sed 's#inet6 .*$##g' | sed '/^[ ]*$/d'