在单行文件中使用grep查找单词/模式的出现次数

时间:2019-12-15 09:30:31

标签: linux bash grep

我在当前目录和子目录中有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代码,它可以工作,但是我想知道是否有使用findgrep或任何其他命令行工具进行此操作的方法。

谢谢

2 个答案:

答案 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内)打印的文件。