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 地址