2017-01-02 3 views
1

Я хочу, чтобы разобрать каждую строку из текста с этой структурой:Shell: использовать Grep на переменном с новой строкой

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

Newlines разделяется на \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) 

Edit: Это то, что происходит, когда я хочу, чтобы распечатать эту переменную с 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 

 Смежные вопросы

  • Нет связанных вопросов^_^