【问题标题】:I'm trying to get a next word after matching word using awk我试图在使用 awk 匹配单词后得到下一个单词
【发布时间】:2017-10-14 01:11:06
【问题描述】:

我正在尝试使用 awk 匹配字段后获取下一个字段。

是否有一个选项可以做到这一点,还是我需要将记录扫描到数组中,然后检查数组中的每个字段并在之后打印一个?

<domain-controller>
<remote host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}" security-realm="ManagementRealm"/>
</domain-controller></pre>

我只想要 9999 作为输出。

awk '{for(i=1;i<=NF;i++)if($i~/master.address/)print $(i+1)}' failed

【问题讨论】:

  • 你为什么用Awk解析XML文件?为什么不xmlstarletxmllint
  • 如果您有其他解决方案,那会很有帮助
  • 从根节点提供完整的XML文件
  • 我没有完整的 xml 文件,我只是从示例文件中得到了几行。我只想 grep 端口号 9999 作为文件的输出

标签: bash shell unix awk sh


【解决方案1】:

要操作 XML 文档,请使用 xml 解析器/工具。
假设您有一个有效的 XML 结构(添加打开的 &lt;pre&gt; 标记就足以使您的结构有效):

<pre>
<domain-controller>
<remote host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}" security-realm="ManagementRealm"/>
</domain-controller></pre>

xmlstarlet 解决方案(使用 XPath 1.0 表达式):

xmlstarlet sel -t -v "substring-before(substring-after(//remote/@port,':'),'}')" -n failed

输出:

9999

substring-after(//remote/@port,':') - 从port 属性值中提取: 之后的子字符串

substring-before("9999}",'}') - 提取结束前的端口号}

【讨论】:

    【解决方案2】:

    你也可以用 grep 做这样的事情:

    grep -oP '(?<=master\.port:)\d+' file
    

    输出:

    9999
    

    当然,所有文件的前导字符串 (master.port:) 必须具有相同的结构,此命令才能正常工作。

    【讨论】:

      【解决方案3】:

      尝试:

      awk '{match($0,/domain.master.port/);if(substr($0,RSTART+20,RLENGTH-15)){print substr($0,RSTART+20,RLENGTH-15)}}'  Input_file
      

      我在这里使用 awk 的 match 关键字并从 domain.master.port 匹配正则表达式,然后根据匹配函数,当匹配正则表达式时,将设置名为 RSTART 和 RLENGTH 的变量,然后打印它们(如果存在)。因此,如果找到匹配项,它将打印数字或 999 值。

      【讨论】:

      • 谢谢mcuh :)
      • 很高兴它对您有所帮助,您可以选择它作为有用的答案或正确的答案,如果您认为它是。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      相关资源
      最近更新 更多