2017-01-02 1 views
1

ich jede Zeile aus einem Text mit dieser Struktur analysieren wollen:Shell: Verwenden Sie grep auf eine Variable mit Zeilenumbrüchen

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

Newlines werden durch \n getrennt.

dieser Datei erzeugen ich ein Programm verwenden, die folgende Ausgabe einige Informationen:

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

dann schreiben ich die $ CONFIG Variable in einer Datei, es ist nur noch einmal zu lesen wieder, was mir falsch zu sein scheint.

echo "$CONFIG" > /tmp/ip 

Dann nach, dass ich verwenden grep die Informationen zu erhalten:

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]?)") 

Ich möchte eine Datei zu schreiben vermeiden. Es wäre besser, oder zumindest scheint es besser, wenn ich die $ CONFIG Variable grep. Die Verwendung von echo $CONFIG führt jedoch nicht zu den Ergebnissen, da damit Zeilenumbrüche ausgeschlossen werden. Das Gleiche gilt für printf.

Ich benutze busybox, wenn das hilft.

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

Edit: Dies ist, was passiert, wenn ich die Variable mit echo drucken möchten:

$ 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' wird auch neue Zeilen ausgeben. –

+0

Danke, ich habe vor einigen Sekunden ein Beispiel hinzugefügt. Leider erfolglos. – fsp

+3

Ohne mit 'grep | grep', können Sie verwenden: 'IP = $ (echo" $ CONFIG "| grep" ipv4address "| grep -E ...)' usw. Beachten Sie die Anführungszeichen um '" $ CONFIG "'. Sie können möglicherweise keine Bash-Strings verwenden, da Sie BusyBox verwenden, aber sie würden einen Prozess speichern, falls verfügbar. Ich würde mit 'sed' anstatt mit' grep | suchen Grep'. Hinweis [Mehrzeilige Ausgabe in eine Bash-Variable aufzeichnen] (https://stackoverflow.com/questions/613572/). –

Antwort

2

Shell Variable sollte fast immer angegeben werden. Wenn Sie anstelle von echo $CONFIG | grep ...echo "$CONFIG" | grep ... verwenden, werden die Zeilenumbrüche beibehalten und Sie erhalten das erwartete Ergebnis.

0

Warum verwenden Sie nicht einfach so etwas?

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