【发布时间】:2021-01-25 03:24:17
【问题描述】:
我正在使用以下 grep 脚本来输出所有不匹配的模式:
grep -oFf patterns.txt large_strings.txt | grep -vFf - patterns.txt > unmatched_patterns.txt
patterns 文件包含以下 12 个字符长的子字符串(一些实例如下所示):
6b6c665d4f44
8b715a5d5f5f
26364d605243
717c8a919aa2
large_strings 文件包含大约 20-1 亿个字符的超长字符串(一小段字符串如下所示):
121b1f212222212123242223252b36434f5655545351504f4e4e5056616d777d80817d7c7b7a7a7b7c7d7f8997a0a2a2a3a5a5a6a6a6a6a6a7a7babbbcbebebdbcbcbdbdbdbdbcbcbcbcc2c2c2c2c2c2c2c2c4c4c4c3c3c3c2c2c3c3c3c3c3c3c3c3c2c2c1c0bfbfbebdbebebebfbfc0c0c0bfbfbfbebebdbdbdbcbbbbbababbbbbcbdbdbdbebebfbfbfbebdbcbbbbbbbbbcbcbcbcbcbcbcbcbcb8b8b8b7b7b6b6b6b8b8b9babbbbbcbcbbbabab9b9bababbbcbcbcbbbbbababab9b8b7b6b6b6b6b7b7b7b7b7b7b7b7b7b7b6b6b5b5b6b6b7b7b7b7b8b8b9b9b9b9b9b8b7b7b6b5b5b5b5b5b4b4b3b3b3b6b5b4b4b5b7b8babdbebfc1c1c0bfbec1c2c2c2c2c1c0bfbfbebebebebfc0c1c0c0c0bfbfbebebebebebebebebebebebebebdbcbbbbbab9babbbbbcbcbdbdbdbcbcbbbbbbbbbbbabab9b7b6b5b4b4b4b4b3b1aeaca9a7a6a9a9a9aaabacaeafafafafafafafafafb1b2b2b2b2b1b0afacaaa8a7a5a19d9995939191929292919292939291908f8e8e8d8c8b8a8a8a8a878787868482807f7d7c7975716d6b6967676665646261615f5f5e5d5b5a595957575554525
我们怎样才能加快上面的脚本(gnu parallel、xargs、fgrep 等)?我尝试使用 --pipepart 和 --block,但它不允许您通过管道传输两个 grep 命令。
顺便说一句,这些都是十六进制字符串和模式。
下面的工作代码比传统的 grep 快一点:
rg -oFf patterns.txt large_strings.txt | rg -vFf - patterns.txt > unmatched_patterns.txt
grep 花了一个小时完成模式匹配过程,而ripgrep 花了大约 45 分钟。
【问题讨论】:
-
1) 尝试
LC_ALL=C grep ...2) 使用ripgrep -
3) 尝试一个或多个
grep -oF -e '6b6c665d4f44' -e '8b715a5d5f5f' large_strings.txt而不是grep -oFf patterns.txt large_strings.txt -
谢谢@Sundeep。我现在正在尝试 ripgrep。仍在等待它完成。
-
@Sundeep 单独执行模式将花费大量时间,因为我的 patterns.txt 文件有超过 3000 万个模式:(
-
您可以尝试使用 Hyperscan 构建的 ripgrep,它可能会更快:sr.ht/~pierrenn/ripgrep 通常,搜索数百万个模式是一个非常专业的用例,ripgrep 和 GNU grep 都不会处理它特别好。如果大部分运行时实际上都花在编译匹配器而不是实际搜索上,我不会感到惊讶。但由于您没有提供重现结果的方法,因此无法确定。
标签: multithreading grep pattern-matching gnu-parallel ripgrep