问题
一同事的朋友正在参加笔试,遇到这么一个问题让他帮忙解决,结果同事又找到我帮他搞定。真是感慨:通讯发达在某些方面来说,真不知是不是好事啊!题目大致如下所示,一般我们使用ifconfig查看网卡信息,请问你可以通过什么命令,让其只输出IP地址192.168.42.128
实现
看似简单的问题,实现起来也不是太简单。看看下面的思路吧
[root@linux ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp7s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether dc:0e:a1:e5:8e:90 brd ff:ff:ff:ff:ff:ff
3: wlp8s0b1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 08:ed:b9:48:61:72 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.252/24 brd 192.168.1.255 scope global noprefixroute wlp8s0b1
valid_lft forever preferred_lft forever
inet6 fe80::9aae:a019:821:b57a/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
到这一步非常简单,接下来就需要借助sed来实现了,如下所示,到此问题解决。
- 删除ip地址左侧字符串
- 用命令 “|sed ‘s#/24.*$##g’”去除IP地址后面的内容:
注意:如果遇到了要过滤“/”,所以我们就不再用“s///g”命令了,用“s###g”代替,而功能上是一样的,除此之外,我们还能用“s:::g”代替。
- 删除ingt6所在的一行
- 删除纯空行和由空格组成的空行
ifconfig wlp8s0b1 | grep "inet" | sed 's/^.*inet //g' | sed 's#netmask .*$##g' | sed 's#inet6 .*$##g' | sed '/^[ ]*$/d'