Shell:在带有换行符的变量上使用grep

时间:2017-01-02 23:00:45

标签: linux shell grep busybox

我想从具有这种结构的文本中解析每一行:

  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

2 个答案:

答案 0 :(得分:2)

应该几乎总是引用Shell变量。如果您使用echo $CONFIG | grep ...代替echo "$CONFIG" | grep ...,则会保留换行符,您将获得预期的结果。

答案 1 :(得分: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