我在当前目录和子目录中有json文件。所有文件都有一行内容。
我要列出所有包含单词XYZ
的文件,以及该文件在该文件中出现的次数。
我想按照以下格式打印列表:
file_name pattern_occurence_times
它看起来应该像这样:
.\x1\x2\file1.json 3
.\x1\file3.json 2
问题是grep
计算包含XYZ
的行的数量,而不是出现的次数。
由于文件的全部内容总是包含在一行中,因此计数始终为1(如果文件中出现模式)。
我为此使用了此命令:
find . -type f -name "*.json" -exec grep --files-with-match -i 'xyz' {} \; -exec grep -wci 'xyz' {} \;
我写了一个python代码,它可以工作,但是我想知道是否有使用find
和grep
或任何其他命令行工具进行此操作的方法。
谢谢
答案 0 :(得分:1)
使用-o
的{{1}}选项,例如与grep
结合使用,例如
wc
答案 1 :(得分:1)
解决此问题的经典方法是管道public class Employee {
public void displayMessage() {
System.out.println("This text is defined in the second class");
}
}
。但是,要在grep -o regex file | wc -l
的{{1}}中执行管道,您必须运行一个shell(例如find
)。但是所有这些东西在一起只会打印出匹配项的数量,而不是文件名。另外,必须将没有匹配项的文件过滤掉。
因此,我认为最好使用单个-exec
命令:
sh -c ...
这里awk
模拟find ... -type f -exec awk '{$0=tolower($0); c+=gsub(/xyz/,"")}
END {if(c>0) print FILENAME " " c}' {} \;
的{{1}}选项。确保只将搜索模式tolower($0)
写成小写。
如果要将其与grep
中的后续过滤器结合使用,则可以在最后一个-i
块的末尾添加xyz
,以继续操作(在find
内)打印的文件。