Bash在变量而不是文件中提取字符串后的值 [英] BASH extract value after string in variable Not file

查看:22
本文介绍了Bash在变量而不是文件中提取字符串后的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现了一个无法解决的奇怪问题。

我需要提取变量中的一些值,这些值位于字符串之后。

本例中变量的名称为:DSLSTATE

下面是其中的值的示例:

NewEnable 1
NewStatus Up
NewDataPath Fast
NewUpstreamCurrRate 21598
NewDownstreamCurrRate 170788
NewUpstreamMaxRate 25692
NewDownstreamMaxRate 170788
NewUpstreamNoiseMargin 90
NewDownstreamNoiseMargin 60
NewUpstreamAttenuation 150
NewDownstreamAttenuation 170
NewATURVendor 41564d00
NewATURCountry 0400
NewUpstreamPower 486
NewDownstreamPower 514

这不是数组。

要提取我想要的值,请执行以下操作:

ATTUPSTREAM=$(echo "$DSLTATE" | awk '{for (I=1;I<NF;I++) if ($I == "NewUpstreamAttenuation") print $(I+1)}')

在此示例中,该值应为150,但始终为空。

奇怪的是,我可以使用相同的命令从相同的变量中提取所有值,但示例中的一个除外。 如果我在终端上执行相同的命令,它就会起作用,脚本就不会起作用。

这里是脚本的摘录:

UPSTREAM=$(echo $DSLSTATE | awk '{for (I=1;I<NF;I++) if ($I == "NewUpstreamCurrRate") print $(I+1)}')
DOWNSTREAM=$(echo $DSLSTATE | awk '{for (I=1;I<NF;I++) if ($I == "NewDownstreamCurrRate") print $(I+1)}')
ATTUPSTREAM=$(echo $DSLTATE | awk '{for (I=1;I<NF;I++) if ($I == "NewUpstreamAttenuation") print $(I+1)}')
ATTDOWNSTREAM=$(echo $DSLSTATE | awk '{for (I=1;I<NF;I++) if ($I == "NewDownstreamAttenuation") print $(I+1)}')
SNRUPSTREAM=$(echo $DSLSTATE | awk '{for (I=1;I<NF;I++) if ($I == "NewUpstreamNoiseMargin") print $(I+1)}')
SNRDOWNSTREAM=$(echo $DSLSTATE | awk '{for (I=1;I<NF;I++) if ($I == "NewDownstreamNoiseMargin") print $(I+1)}')

结果如下:

ATTUPSTREAM=
ATTDOWNSTREAM=170
SNRUPSTREAM=40
SNRDOWNSTREAM=50

可能在DSLSTATE变量的值之间的空格中有一些奇怪的字符?

希望有人能开导我。

推荐答案

  1. awk或未导出的外壳变量不要全部使用大写名称,以避免与内置变量和其他原因冲突,例如外壳问题请参见Correct Bash and shell script variable capitalization

  2. 当输入为 始终在标记值对中。

  3. 当您有公共代码时,请将其 在一个函数中,不要重复多次-就我们所知 代码中可能存在控制字符或其他问题 一个标记值。

首先将代码更改为使用简单的查找函数:

$ tag2val() { echo "$DSLSTATE" | awk -v tag="$1" '$1==tag { print $2 }'; }

$ tag2val NewDataPath
Fast

$ tag2val NewUpstreamAttenuation
150

如果您仍然有问题,请告诉我们。如果是,则编辑您的问题以显示echo "$DSLSTATE" | cat -Ev的输出。

这篇关于Bash在变量而不是文件中提取字符串后的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆