2013-03-27 126 views
1

我需要看一條線,並執行快速,如果/則 - >它的回聲取決於列的內容3.中的Bash循環和if語句

文件看起來是這樣的:

name network subnetmask 
net_A 192.168.0.0 24 
net_b 10.10.0.0 16 

一些列也有一個空白的第三列,我也需要有一個if/then。

僞代碼看起來應該像這樣在我的腦海:

snet_mask=`cat $filename | grep -i net | awk '{print $3}` 
if [ $snet_mask = 24 ] 
then 
awk '{print "something"$1,"something else"}' 
fi 
if [ $snet_mask = 23 ] 
then 
awk '{print "something"$1,"something else"}' 
fi 

這是行不通的,似乎,因爲$ snet_mask成爲$ 3「所有」的價值,所以我想我需要一個基於grep -i net的for循環,但是我不知道。

什麼是正確答案? :)

回答

1

嘗試使用下面的襯板:

awk '$1 ~ "^net" && $3==24{print "something", $3, "something else"} $1 ~ "^net" $3==23{print "something", $3, "something else"}' file.txt 

或者多線(更易於閱讀):

awk ' 
    $1 ~ "^net" && $3==24{print "something", $3, "something else"} 
    $1 ~ "^net" && $3==23{print "something", $3, "something else"} 
' file.txt 

我們可以這樣做只是這樣太(取決於您的需求):

awk ' 
    $1 ~ "^net" && ($3==24 || $3==23) {print "something", $3, "something else"} 
' file.txt 

或者也可以簡單&最短用正則表達式:

awk ' 
    $1 ~ "net" && $3 ~ "^2[34]$" {print "something", $3, "something else"} 
' file.txt 
+0

哇,這是容易得多。謝謝 – Numpty 2013-03-27 16:53:52

+0

@Numpty,不客氣 – 2013-03-27 16:55:36

+0

添加「網絡」匹配(錯過那個部分) – 2013-03-27 16:58:08

1

,你可以完成你在一個awk語句需要的東西,因爲你已經在使用AWK

cat $filename | grep -i net | awk '{if($3==24) print $1; else print $0;}' 

在if語句(如果第3欄是23),我剛打印第一列,否則我正在打印所有內容。很明顯,你可以擴大這個與所有的情況下

+0

謝謝Brett - 看起來和sputnick差不多。既然他揍你一拳,我會和他一起去的,但是這裏有一個+1 :) – Numpty 2013-03-27 16:54:23

+1

'cat | grep | awk'?哇,這是一個叉節日! =) – 2013-03-27 16:54:44

+0

哈哈,是啊...老習慣很難:D – Numpty 2013-03-27 16:55:12

0

在bash入住,無需外部工具工作,你可以做這樣的事情:

while read name network netmask ; do 
    if [[ "$name" == net* ]] ; then 
     case "$netmask" in 
      "") echo "It's empty" ;; 
      24) echo "It's 24" ;; 
      23) echo "It's 23" ;; 
      *) echo "None of the above" ;; 
     esac 
    fi 
done < "$filename" 
+0

糟糕,顯示我的年齡那裏。這是真實的引用重定向文件名是不需要的,但不是bash,所以,是的,你是正確的,引號應該使用。 (幾年前,我實際上因爲使用它們而遭到苛責,但是這改變了......) – William 2013-03-27 17:36:51

+0

我想知道那是什麼'sh',我在經典的Bourne shell中沒有引號的時候嘗試過它,並且出現了「模糊的重定向」錯誤。另一方面,引號不是圍繞雙方括號內左側的變量,也不是圍繞case語句中的變量。 – Scrutinizer 2013-03-27 19:38:47

+1

實際上,如果你將bash作爲/ bin/sh啓動,它至少在Linux上遵守舊的解析規則。 (我檢查過,當我的shebang是'#!/ bin/sh'而不是'#!/ bin/bash'時bash模擬了sh當它通過sh鏈接啓動時)。它是經典sh變量的標準關聯與< and >,或案件之間,擴展後不會分裂。 (過去,我的口味包括AIX,SunOS,HP-UX) – William 2013-03-28 15:52:19