如何仅打印 1 个文件名以及匹配的模式?

如何仅打印 1 个文件名以及匹配的模式?

我想将文件名与匹配模式一起打印,但即使模式匹配在文件中多次出现,也仅打印一次。

例如,我有一个模式列表;list_of_patterns.txt我需要查找文件的目录是/path/to/files/*.

模式列表.txt:

A
B
C
D
E

/路径/到/文件/

/file1
/file2
/file3

假设/file1该模式A多次出现,如下所示:

/文件1:

A
4234234
A
435435435
353535
A

(对于存在多个模式匹配的其他文件也同样如此。)

我运行了这个 grep 命令,但每次模式匹配时它都会打印文件名。

grep -Hof list_of_patterns.txt /path/to/files/*

输出:

/file1:A
/file1:A
/file1:A
/file2:B
/file2:B
/file3:C
/file3:B
... and so on.

我知道 sort 可以在 grep 命令之后通过管道执行此操作,grep -Hof list_of_patterns.txt /path/to/files/* | sort -u但它仅在 grep 完成时执行。在现实世界中,我的list_of_patterns.txt内部有数百种模式。有时需要一个小时才能完成任务。

有没有更好的方法来加速这个过程?

更新:有些文件有超过一百次的匹配模式。例如,/file4该模式出现了A900 次。这就是为什么需要grep一个小时才能完成的原因,因为它会将每次出现的模式匹配与文件名一起打印。

例如输出:

/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
... and so on til' it reach 900 occurrences.

我只想让它打印一次。

例如期望的输出:

/file4:A
/file1:A
/file2:B
/file3:A
/file4:B

答案1

有没有更好的方法来加速这个过程?

是的,它的名字叫 GNUparallel:

parallel -j0 -k "grep -Hof list_of_patterns.txt {} | sort -u" ::: /path/to/files/*
  • j N- 职位数量。并行运行N作业。0意思是尽可能多。
  • k( --keep-order) - 保持输出顺序与输入顺序相同
  • ::: arguments- 使用arguments命令行作为输入源而不是 stdin(标准输入)

相关内容