2016-02-09 97 views
0

我有一個文件「IP」,其中包含不同的子網IP地址數,我想將子網的最後八進制數字改爲1.1.1.51.1.1.0/24。我寫了劇本。問題是awk命令沒有分配給任何變量。bash腳本中的「sed/awk」值分配

例子:

sed "s/139.196.8.79/139.196.8.0\/24/g" ip |a=$(awk -F. '{print $4}') 

但是當我運行awk -F. '{print S4}',它返回的輸出,但是不分配值的變量。

在此先感謝。

+3

用預期輸出顯示您的樣本輸入 – anubhava

回答

2

不知道你的預期產量,但...看這裏你上面的例子,也許,你正在尋找的東西是這樣的:

$ a=$(sed "s/139.196.8.79/139.196.8.0\/24/g" ip | awk -F. '{print $4}') 
$ echo $a 
0/24 
+1

這會將像6213951962837926這樣的隨機數字串變換成62139.196.8.0/2426。你必須逃避''。 –

+0

謝謝..是啊,這是我所期待的..但我想在這個腳本中使用「for循環」,並希望從「IP」文件獲得每個IP地址,並將其用作模式,並使用awk打破它的八進制,並最終替換最後的八進制與子網0./24。感謝所有的及時響應 –

+0

@EchoQ聽起來像你正在接近這個錯誤的方式,並計劃在一個shell循環內多次調用各種工具。請閱讀http://unix.stackexchange.com/q/169716/133219和Arnold Robbins編寫的「有效的Awk編程」第4版。 –

1

你試圖寫的是:

a="$(sed "s/139.196.8.79/139.196.8.0\/24/g" ip | awk -F. '{print $4}')" 

,但你需要躲避RE元字符(. S),當你使用AWK你不需要SED:

a="$(awk -F. '{gsub(/139\.196\.8\.79/,"139.196.8.0/24"); print $4}' ip)" 

以上內容未經測試,可能是錯誤的或不是最佳方法,因爲您未在問題中提供任何示例輸入和預期輸出。

注意上面確實應該使用單詞邊界,如果像139.196.8.790的IP地址可能會出現在你的數據,但同樣沒有樣品的輸入和預期的輸出....

0

的管道建立一個子進程。這意味着你在一個子shell中創建了這個變量,這個變量在之後被丟棄。爲了訪問變量,你必須將你的命令到大括號:你想與a

sed "s/139.196.8.79/139.196.8.0\/24/g" ip | { 
    a=$(awk -F. '{print $4}') 
    echo $a 
} 

一切都必須在子殼,其中a已經定義完成。

+0

我會測試你的所有建議,並會更新。感謝每個人 –