Shell:对带有换行符的变量使用 grep
Shell: use grep on a variable with newlines
我想从具有这种结构的文本中解析每一行:
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]?)")
我想避免写入文件。如果我可以在 $CONFIG 变量上进行 grep,那会更好,或者至少看起来更好。但是使用 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
Shell 变量应该几乎总是被引用。如果您使用 echo "$CONFIG" | grep ...
而不是 echo $CONFIG | grep ...
,换行符将被保留,您将获得预期的结果。
你为什么不直接使用这样的东西?
eval $(umbim $DBG -d $device -n -t $tid config | tr -d ' ' | grep ^ipv4 | tr a-z: A-Z=)
IP=${IPV4ADDRESS%/*}
NM=${IPV4ADDRESS##*/}
GW=$IPV4GATEWAY
我想从具有这种结构的文本中解析每一行:
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]?)")
我想避免写入文件。如果我可以在 $CONFIG 变量上进行 grep,那会更好,或者至少看起来更好。但是使用 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
Shell 变量应该几乎总是被引用。如果您使用 echo "$CONFIG" | grep ...
而不是 echo $CONFIG | grep ...
,换行符将被保留,您将获得预期的结果。
你为什么不直接使用这样的东西?
eval $(umbim $DBG -d $device -n -t $tid config | tr -d ' ' | grep ^ipv4 | tr a-z: A-Z=)
IP=${IPV4ADDRESS%/*}
NM=${IPV4ADDRESS##*/}
GW=$IPV4GATEWAY