【问题标题】:awk passing shell variables through awk commandsawk 通过 awk 命令传递 shell 变量
【发布时间】:2020-03-28 12:10:11
【问题描述】:

在一个 .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 $2}' | cut -d \" -f2

正确的结果是 45.4558。

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

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

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

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

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

【问题讨论】:

标签: shell awk getline


【解决方案1】:

请您尝试关注一下。

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

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

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

上述命令的输出将为45.4558

【讨论】:

  • 您提供的内容可以正确打印出该行,但无法执行 awk 命令以仅打印 column2 和 cut 命令。因此,这可以作为变量传递,然后我可以回显它以获得我需要的东西,除非一行中的某些东西可以实现这一点。
  • @M.Simpson,当然,请尝试我编辑的解决方案,让我知道这是否对您有帮助?
  • 要在正则表达式(包括 FS)中使用一组字符,["=]"|= 更清晰,更容易扩展添加其他字符。考虑写[abcde] 与必须在每对之间加上|a|b|c|d|e 的更一般的情况。
  • @EdMorton,当然 Ed 先生,这是真的。我现在已经进行了更改,谢谢先生在这里的指导,干杯。
  • 我真的只是想把它改成-F'["=]' 但这也很好。
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 1970-01-01
相关资源
最近更新 更多