Bash在变量而不是文件中提取字符串后的值 [英] BASH extract value after string in variable Not file
本文介绍了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变量的值之间的空格中有一些奇怪的字符?
希望有人能开导我。
推荐答案
awk或未导出的外壳变量不要全部使用大写名称,以避免与内置变量和其他原因冲突,例如外壳问题请参见Correct Bash and shell script variable capitalization。
当输入为 始终在标记值对中。
当您有公共代码时,请将其 在一个函数中,不要重复多次-就我们所知 代码中可能存在控制字符或其他问题 一个标记值。
首先将代码更改为使用简单的查找函数:
$ tag2val() { echo "$DSLSTATE" | awk -v tag="$1" '$1==tag { print $2 }'; }
$ tag2val NewDataPath
Fast
$ tag2val NewUpstreamAttenuation
150
如果您仍然有问题,请告诉我们。如果是,则编辑您的问题以显示echo "$DSLSTATE" | cat -Ev
的输出。
这篇关于Bash在变量而不是文件中提取字符串后的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文