awk 通过 awk 命令传递 shell 变量

awk passing shell variables through awk commands

在 .xml 文件中,我有一些信息:

 <var name="site1">
     <location lat="45.4558" lon="-98.4131" ht="422.0"/>
 </var>
 <var name="site2">
     <location lat="35.1497" lon="-106.8239" ht="1814.0"/>
 </var>
 <var name="site3">
     <location lat="36.9839" lon="-77.0075" ht="78.0"/>
 </var>

我想在搜索 'sitex' 后提取该行。这很容易完成:

 awk '/site1/{getline;print}'

哪个会正确输出:

 <location lat="45.4558" lon="-98.4131" ht="422.0">

现在,如果我想获取纬度信息,我可以使用完整的行来完成此操作:

 awk '/site1/{getline;print}' | awk '{print }' | cut -d \" -f2

这会正确地产生 45.4558。

现在,如果我想将一个变量传递给 awk,这可以通过“-v”命令完成,我有如下所示的内容:

 locc="site1"
 awk -v var="$locc" '/var/{getline;print}' | awk '{print }' | cut -d \" -f2

但是,这不会产生任何结果(即没有输出)。这里可能有什么问题?如果我只是尝试:

 awk -v var="$locc" 'BEGIN{print var}'

我将 site1 作为输出。因此,它正确加载了我传递的字符串,但没有正确解析信息。

能否请您尝试以下。

var="site1"
awk -v val="$var" 'index([=10=],val){found=1;next} found{print;found=""}' Input_file

要仅获取特定值,请尝试以下操作。

awk -v val="$var" 'BEGIN{FS="[\"=]"}index([=11=],val){found=1;next} found{print ;found=""}' Input_file

上述命令的输出将是 45.4558