使用 GNU parallel 的所有文件中字符串出现的次数

Number of occurences of a String in all files using GNU parallel

我正在尝试从目录中的所有文件中获取特定字符串的计数

所以我使用了 find -name "application.log*" |并行 zgrep -c "Instructions before" {}

我的预期是它会计算所有 application.log 个文件中的字符串 "Instructions before"

但它实际上给出了这样的输出

find -name "application.log*" | parallel zgrep -c "Instructions before" {}
./application.log.2020-05-22-08-24.gz:0
gzip: before.gz: No such file or directory
before:0
./application.log.2020-05-22-08-22.gz:0
gzip: before.gz: No such file or directory
before:0
./application.log.2020-05-22-08-29.gz:0
gzip: before.gz: No such file or directory

这是一个引用问题。引号被 shell 吃掉,所以每个 zgrep 进程被调用为 zgrep -c Instructions before ./application.log.blah.gzInstructions 作为要搜索的字符串,before 其中之一要搜索的文件 - zgrep 如果缺少 .gz 显然会添加扩展名。

所以你需要引用引号:

find -name "application.log*" -print0 | parallel -0 zgrep -c '"Instructions before"' {}

或告诉parallel为您做:

find -name "application.log*" -print0 | parallel -0q zgrep -c "Instructions before" {}

如果您关心的所有文件都在同一个目录中而不是在子目录中,请参阅 Mark 的评论以获得避免 find.

的更简单方法