【问题标题】:using grep in single-line files to find the number of occurrences of a word/pattern在单行文件中使用 grep 来查找单词/模式的出现次数
【发布时间】:2019-12-17 14:19:21
【问题描述】:

我在当前目录和子目录中有 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 或任何其他命令行工具来做到这一点。

谢谢

【问题讨论】:

    标签: linux bash grep


    【解决方案1】:

    解决这个问题的经典方法是管道grep -o regex file | wc -l。但是,要在find-exec 中执行管道,您必须运行一个shell(例如sh -c ...)。但是所有这些东西一起只会打印匹配的数量,而不是文件名。此外,必须过滤掉不匹配的文件。

    由于所有这些,我认为单个 awk 命令会更好:

    find ... -type f -exec awk '{$0=tolower($0); c+=gsub(/xyz/,"")}
                                END {if(c>0) print FILENAME " " c}' {} \;
    

    这里tolower($0) 模拟grep-i 选项。确保将您的搜索模式xyz 仅使用小写。

    如果您想将此与find 中的后续过滤器结合使用,您可以在最后一个awk 块的末尾添加else exit 1 以继续(在find 内)仅打印文件。

    【讨论】:

    • 是的,我想它会更快。
    • @oguzismail 它工作得更快,但是当我输入if(count>3) 时它没有任何效果,它打印的次数甚至少于 3 次!
    【解决方案2】:

    使用grep-o 选项,例如结合wc,例如

    find . -name "*.json" | while read -r f ; do
       echo $f : $(grep -ow XYZ "$f" | wc -l)
    done
    

    【讨论】:

    • 我之前试过,但我不知道如何使用grepwc 以及find,你能告诉我怎么做吗?
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2018-07-08
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多