我在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 ...
我还想要它所属的文件的名称。
答案 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~]#