【问题标题】:Shell: use grep on a variable with newlinesShell:在带有换行符的变量上使用 grep
【发布时间】:2017-01-02 23:00:45
【问题描述】:

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

  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

【问题讨论】:

  • echo -e 也会输出新行。
  • 谢谢,几秒钟前我添加了一个示例。不成功很不幸。
  • 不处理grep | grep,你可以使用:IP=$(echo "$CONFIG" | grep "ipv4address" | grep -E …)等。注意"$CONFIG"周围的双引号。由于您使用的是 BusyBox,因此您可能无法使用 Bash 'here strings',但如果可用,它们会保存一个进程。我会考虑使用sed 而不是grep | grep。注意Capturing multi-line output to a bash variable.
  • 可以添加一个又快又脏的sed(例如echo -e "$CONFIG" | sed $'s/ ip/\\\nip/g'
  • 致反对者:为什么反对?

标签: linux shell grep busybox


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你为什么不直接使用这样的东西?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      相关资源
      最近更新 更多