我在使用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
答案 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值。