1. 程式人生 > >awk -F選項同時指定多個符號做為分割符時遇到空格坑,題目:請執行命令取出 linux 中 eth0 的 IP 地址

awk -F選項同時指定多個符號做為分割符時遇到空格坑,題目:請執行命令取出 linux 中 eth0 的 IP 地址

取出linux中eth0的ip地址 awk空格遇坑 老男孩第三關課前考試題的第三個筆試題

第三關課前考試題: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 地址