我在尝试使用awk匹配单词后尝试下一个单词

时间:2017-05-15 09:48:44

标签: bash shell unix awk sh

我在使用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

3 个答案:

答案 0 :(得分:1)

使用xml解析器/工具来操作XML文档 假设您有一个有效的XML结构(它足以添加开始<pre>标记以使您的结构有效):

<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}",'}') - 在结束}之前提取端口号

答案 1 :(得分:0)

你也可以用grep:

做这样的事情
grep -oP '(?<=master\.port:)\d+' file

输出:

9999

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

答案 2 :(得分:0)

尝试:

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

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