如何获取包含特定搜索字符串的文件名列表及其句子?

时间:2014-04-07 11:10:35

标签: xml regex bash awk

我在unix机器上尝试了以下命令:

ls -l | awk '{print $9}' | xargs -I {} cat  {}  | grep {"String to search"}

虽然这适用于文本文件但是当我尝试使用xml文件时,它无法显示正确的grepped文本。而是显示整个xml文件。

我认为这背后可能的原因是缺少我使用的xml文件中的新行字符。

实施例: 搜索字符串:"/1031/"

包含搜索字符串的Xml行:<eventtype uri="{any_url}/1031/"/>

澄清一下:

ls -l | awk '{print $9}' | xargs -I {} cat {} | grep -o "/1031"

这样输出为:

/ 1031

/ 1031

/ 1031 ...

我还想要它所属的文件的名称。

2 个答案:

答案 0 :(得分:4)

grep有一个标志-o,它只输出匹配的文本。

ls -l | awk '{print $9}' | xargs -I {} cat {} | grep -o {"String to search"}

从您的编辑中看起来您需要包含URL的“行”。默认情况下,grep会贪婪地匹配,这意味着考虑XML格式的正则表达式仍然会给你一个不正确的结果。

我可以想到两个可能的选择:

对于下一个示例,test.xml包含字符串:

<eventtype uri="{www.example1.com}/1031/"/><eventtype uri="{www.example2.com}/1031/"/><eventtype uri="{www.example3.com}/1031/"/>

第一种是使用-p标志用于grep来启用perl语法并且懒惰地匹配。

grep -Po '".*?/1031/"' test.xml 

输出:

"{www.example1.com}/1031/"
"{www.example2.com}/1031/"
"{www.example3.com}/1031/"

第二种方法是使用sed在每次匹配后手动追加换行符并输入grep:

sed 's/1031/1031\n/g' test.xml | grep 1031

输出:

<eventtype uri="{www.example1.com}/1031
/"/><eventtype uri="{www.example2.com}/1031
/"/><eventtype uri="{www.example3.com}/1031

我相信这两种方法都可以在纯文本文件上正常工作,尽管您可能需要在.xml扩展名上有条件地使用这些方法之一。

答案 1 :(得分:1)

亲爱的你可以使用以下命令

find -type f -exec grep -HPo '".*?/1031/"' {} \;

示例输出

  

[root @MUM03S001~] #find -type f -exec grep -HPo'“。*?/ 1031 /”'{} \;

     

./文件: “{} www.example1.com / 1031 /”

     

./文件: “{} www.example2.com / 1031 /”

     

./文件: “{} www.example3.com / 1031 /”

     

[root @MUM03S001~]#