Я хочу, чтобы разобрать каждую строку из текста с этой структурой: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
'echo -e' также выводит новые строки. –
Спасибо, я добавил пример несколько секунд назад. Неудачный несчастный. – fsp
Без работы с 'grep | grep', вы можете использовать: 'IP = $ (echo" $ CONFIG "| grep" ipv4address "| grep -E ...)' и т. д. Обратите внимание на двойные кавычки вокруг '' $ CONFIG''. Возможно, вы не сможете использовать «настоящие строки» Bash, так как вы используете BusyBox, но они сохранили бы процесс, если он был доступен. Я бы посмотрел на использование 'sed', а не' grep | grep'. Примечание. [Захват многострочного вывода переменной bash] (https://stackoverflow.com/questions/613572/). –