第三关课前考试题:3.请执行命令取出 linux 中 eth0 的 IP 地址(请用 cut,有能力者也可分别用 awk,sed 命令答)
因为以前有个题讲过awk -F选项可以指定输入分割符,也可以同时使用多个符号作为分割符对文件进行切割,所以我决定先使用awk -F
以前awk -F同时指定多个分割符的例子:
[[email protected] ~]# cat oldboy.txt I am oldboy,myqq is 31333741 [[email protected] ~]# awk -F "[ ,]" ‘{print $3,$6}‘ oldboy.txt oldboy 31333741
然后开始做题:请执行命令取出 linux 中 eth0 的 IP 地址
[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $1}‘ [[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $2}‘ [[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $3}‘ [[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $4}‘
一直打印到第四列,都没有任何东西输出到屏幕上,然后我的头顶开始冒出一堆的问号。。。这是什么情况?不按套路跟我玩啊?
那好吧,用$0打印全部列试试
[[email protected] ~]# 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之间是有两个空格,我猜有可能是因为这个原因(最后证明这并不是根本原因),导致用一个空格做为分割符有可能不行?这时候想到有个+号可以使用连续多个相同的符号做为分割符,试试!
[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘:|[ ]+‘ ‘{print $4}‘ 192.168.56.130
哈!成功了!
但是之前的命令 [[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $4}‘ 没有任何错误提示,说明应该是正确的,但是为什么没有任何输出呢?
打印一下最后一列和倒数的几列试试
[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $NF}‘ 255.255.255.0 [[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $(NF-1)}‘ Mask [[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $(NF-2)}‘ [[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $(NF-3)}‘ 192.168.56.255
没问题,说明这个命令是正确的
最后我又打印了一下整列仔细观察了一下:
[[email protected] ~]# 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!我竟然被一堆小小的不起眼的空格给坑了!赶紧再试一下
[[email protected] ~]# ifconfig eth0 |sed -n ‘2p‘ |awk -F ‘[: ]‘ ‘{print $13}‘ 192.168.56.130
终于出现了。。。
至此,问题终于清晰,最初的方法并没有错,问题在于这一行字符最开始有十个空格,会占用十列,所以导致打印前十列的时候,只输出一个空的内容,而像我这样刚入门的小白,很容易就会以为出错了。
关于此题的其他解法,等有时间了我会陆续进行补充。其他解法的大体思路基本都差不多,现在能想到至少有四、五种解法,但其实都是换汤不换药,只要掌握了核心思想,会一种解法,稍微变通一下,就又成了另一种解法。