第三关课前考试题:3.请执行命令取出 linux 中 eth0 的 IP 地址(请用 cut,有能力者也可分别用 awk,sed 命令答)

因为以前有个题讲过awk -F选项可以指定输入分割符,也可以同时使用多个符号作为分割符对文件进行切割,所以我决定先使用awk -F

以前awk -F同时指定多个分割符的例子:

[root@oldboyedu41-1 ~]# cat oldboy.txtI am oldboy,myqq is 31333741[root@oldboyedu41-1 ~]# awk -F "[ ,]" '{print $3,$6}' oldboy.txt oldboy 31333741

然后开始做题:请执行命令取出 linux 中 eth0 的 IP 地址

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $1}'[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $2}'[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $3}'[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $4}'

一直打印到第四列,都没有任何东西输出到屏幕上,然后我的头顶开始冒出一堆的问号。。。这是什么情况?不按套路跟我玩啊?

那好吧,用$0打印全部列试试

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $0}'          inet addr:192.168.56.130  Bcast:192.168.56.255  Mask:255.255.255.0

没问题!

奇怪!

我仔细观察了一下这行文档,发现inet addr:192.168.56.130和Bcast:192.168.56.255和Mask:255.255.255.0之间是有两个空格,我猜有可能是因为这个原因(最后证明这并不是根本原因),导致用一个空格做为分割符有可能不行?这时候想到有个+号可以使用连续多个相同的符号做为分割符,试试!

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F ':|[ ]+' '{print $4}'192.168.56.130

哈!成功了!

但是之前的命令 [root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $4}' 没有任何错误提示,说明应该是正确的,但是为什么没有任何输出呢?

打印一下最后一列和倒数的几列试试

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $NF}'255.255.255.0[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $(NF-1)}'Mask[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $(NF-2)}'[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $(NF-3)}'192.168.56.255

没问题,说明这个命令是正确的

最后我又打印了一下整列仔细观察了一下:

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $0}'          inet addr:192.168.56.130  Bcast:192.168.56.255  Mask:255.255.255.0

咦?这一行字符的最前面好象有一些空格!难道每一个空格都被分割为一列了吗???

WTF!我竟然被一堆小小的不起眼的空格给坑了!赶紧再试一下

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p' |awk -F '[: ]' '{print $13}'192.168.56.130

终于出现了。。。

至此,问题终于清晰,最初的方法并没有错,问题在于这一行字符最开始有十个空格,会占用十列,所以导致打印前十列的时候,只输出一个空的内容,而像我这样刚入门的小白,很容易就会以为出错了。

关于此题的其他解法,等有时间了我会陆续进行补充。其他解法的大体思路基本都差不多,现在能想到至少有四、五种解法,但其实都是换汤不换药,只要掌握了核心思想,会一种解法,稍微变通一下,就又成了另一种解法。

20170929更新:其他解法

方法1sed + cut + cut

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p'|cut -d ":" -f2 |cut -d " " -f1192.168.56.130

方法2awk + cut + cut -c

[root@oldboyedu41-1 ~]# ifconfig eth0 |awk 'NR==2'|cut -d ":" -f2 |cut -c1-14192.168.56.130

方法3sed + cut + sed

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p'|cut -d ":" -f2 |sed 's# Bcast##g'192.168.56.130

方法4sed + awk

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p'|awk -F ':|[ ]+' '{print $4}'192.168.56.130

方法5:awk

[root@oldboyedu41-1 ~]# ifconfig eth0 |awk -F '[: ]+' 'NR==2 {print $4}'192.168.56.130

方法6sed + sed + awk

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2p'|sed 's#[a-Z:]##g' |awk '{print $1}'192.168.56.130

方法6可以简化为:sed + awk

[root@oldboyedu41-1 ~]# ifconfig eth0 |sed -n '2s#[a-Z:]##gp' |awk '{print $1}'192.168.56.130

方法7:sed

[root@oldboyedu41-1 ~]# ifconfig eth0|sed -nr '2s#^.*:(.*)B.*$#\1#gp'192.168.56.130

方法8:grep + cut ,此方法仅针对手动设置静态IP地址有效

[root@oldboyedu41-1 ~]# grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth0|cut -d= -f2192.168.56.130

还有其他解法,但都大同小异,这里不再赘述了。