2017-01-02 29 views
1

我想從與該結構的文本解析每個行:外殼:對一個變量用grep用換行

ipv4address: 1.2.3.4/29 
    ipv4gateway: 1.2.3.1 
    ipv4mtu: 1500 
    ipv4dnsserver: 8.8.8.8 
    ipv4dnsserver: 8.8.4.4 

換行符由\n分隔。

要生成此文件,我用這將輸出一些信息的程序:

CONFIG=$(umbim $DBG -d $device -n -t $tid config) || { 
     echo "mbim[$$]" "config failed" 
     return 1 
    } 

然後我寫出來的$ CONFIG變量文件,只需再次重讀它,這似乎是我錯了。

echo "$CONFIG" > /tmp/ip 

然後在那之後我用grep來獲取信息:

IP=$(grep "ipv4address" /tmp/ip |grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)") 
NM=$(grep "ipv4address" /tmp/ip |grep -o '.\{2\}$') 
GW=$(grep "ipv4gateway" /tmp/ip |grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)") 

我想避免寫入文件。這會更好,或者至少,如果我可以grep $ CONFIG變量,似乎會更好。但使用echo $CONFIG將不會產生結果,因爲換行符會被忽略。與printf相同。

我正在使用busybox,如果有幫助。

BusyBox v1.25.1() built-in shell (ash) 

編輯:這是當我想打印出變量與echo會發生什麼:

$ CONFIG=$(cat /tmp/ip) 
$ echo -e $CONFIG 
ipv4address: 1.2.3.4/29 ipv4gateway: 1.2.3.1 ipv4mtu: 1500 ipv4dnsserver: 8.8.8.8 ipv4dnsserver: 8.8.4.4 
+0

echo -e'也會輸出新行。 –

+0

謝謝,我在幾秒前添加了一個示例。不成功的不幸。 – fsp

+3

不處理'grep | grep',你可以使用:'IP = $(echo「$ CONFIG」| grep「ipv4address」| grep -E ...)'等等'注意''$ CONFIG''周圍的雙引號。你可能無法使用Bash'這裏的字符串',因爲你使用的是BusyBox,但是如果可用的話,它們會保存一個進程。我會看看使用'sed'而不是'grep | grep'。注意[將多行輸出捕獲到bash變量](https://stackoverflow.com/questions/613572/)。 –

回答

2

shell變量應該總是被引用。如果使用echo "$CONFIG" | grep ...代替echo $CONFIG | grep ...,則換行符將被保留,並且您將獲得預期的結果。

0

爲什麼你不會使用這樣的東西?

eval $(umbim $DBG -d $device -n -t $tid config | tr -d ' ' | grep ^ipv4 | tr a-z: A-Z=) 
IP=${IPV4ADDRESS%/*} 
NM=${IPV4ADDRESS##*/} 
GW=$IPV4GATEWAY