如何从文件中多次出现的两个字符串中提取值

时间:2014-11-05 04:52:56

标签: bash shell awk sed grep

我试图从两个字符串之间拉取值并换行每个结果。然后我希望将它与同一文档中的另一个值以相同的方式结合起来。问题是此文件中没有换行符,并且它非常大。以下是该文件的示例。

<ID>47</ID><DATACENTER_ID>36</DATACENTER_ID><DNS_NAME>myhost.domain.local</DNS_NAME>      <IP_ADDRESS>10.0.0.1</IP_ADDRESS><ID>60</ID><DATACENTER_ID>36</DATACENTER_ID><DNS_NAME>yourhost.domain.local</DNS_NAME><IP_ADDRESS>10.0.0.2</IP_ADDRESS>

我的最终结果理想情况下会是这样的。

ID-----DNS_NAME
47-----myhost.domain.local
60-----yourhost.domain.local

到目前为止,我最接近的尝试是使用grep创建变量,但我似乎无法将它们格式化为表格。我也非常喜欢脚本,所以请原谅我的无知。

2 个答案:

答案 0 :(得分:2)

如果您的grep支持-P--Perl-regexp),那么您可以自由使用以下正则表达式。

$ grep -oP '<ID>\K[^<>]*(?=</ID>)|<DNS_NAME>\K[^<>]*(?=</DNS_NAME>)' file | sed 'N;s/\n/-----/g'
47-----myhost.domain.local
60-----yourhost.domain.local

\K放弃以前匹配的字符进行打印。

(?=...) posiitve lookahead断言,断言匹配发生的位置。它不会消耗任何角色。

答案 1 :(得分:0)

以下是gnu awkRS中的多个字符)以获取您的数据:

awk -v RS="<ID>" -F"<|>" 'NR>1 {print $1"-----"$9}' file
47-----myhost.domain.local
60-----yourhost.domain.local