grep命令有两个搜索条件

时间:2016-08-08 18:17:29

标签: awk grep

`我的文件内容如下。

<path
action="A"
kind="file">/Demo/svn_dev/src/classes/Util - Copy.cls</path><path
action="D"
kind="file">/Demo/svn_dev/src/classes/Admin.cls</path>
<path action="M"
kind="file">/Demo/svn_dev/src/classes/AdminUtilCtrl.cls</path>
</paths>
<msg>xyz</msg>

如果消息包含字符串&#34; xyz&#34;我需要检索文件的路径。和行动=&#34; D&#34; 在这里,我需要得到输出为/Demo/svn_dev/src/classes/Admin.cls 任何人都可以用grep命令语法帮助我。如果您需要任何进一步的信息,请告诉我。 谢谢你的帮助

2 个答案:

答案 0 :(得分:2)

你不能用grep完成这项工作。这是使用GNU awk进行多字符RS和第3次arg进行匹配()的一种方法:

$ cat tst.awk
BEGIN { RS="\\s*</[^>]+>\\s*" }
match($0,/^<path\s*action="D"[^>]+>(.*)/,a) { act = a[1] }
/^<msg>xyz$/ { print act }

$ awk -f tst.awk file
/Demo/svn_dev/src/classes/Admin.cls

答案 1 :(得分:0)

使用grep你可以条件存在第一个模式来提取第二个,需要一点点工作后提取信息

$ grep -q '<msg>xyz</msg>' file && grep -A1 'action="D"' file | 
  sed -n -r '$s/[^>]*>(.*)<.*/\1/p'

/Demo/svn_dev/src/classes/Admin.cls

但是,如果您的换行符与发布的文本不同,则所有内容都可能失败。也许最好使用xml感知工具。