awk -F选项同时指定多个符号做为分割符时遇到空格坑,题目:请执行命令取出 linux 中 eth0 的 IP 地址

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk -F选项同时指定多个符号做为分割符时遇到空格坑,题目:请执行命令取出 linux 中 eth0 的 IP 地址相关的知识,希望对你有一定的参考价值。

第三关课前考试题: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

终于出现了。。。


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


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

本文出自 “老潘Linux” 博客,请务必保留此出处http://oldpan.blog.51cto.com/1603893/1969155

以上是关于awk -F选项同时指定多个符号做为分割符时遇到空格坑,题目:请执行命令取出 linux 中 eth0 的 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

AWK

AWK用法详解

Linux-AWK

Linux之awk详解

awk

awk 命令