Grep 有一个-f
从文件中读取模式的开关。-v
将其与仅打印不匹配的行结合起来,您就有了一个优雅的解决方案。由于您的模式是固定字符串,因此您可以在使用-F
.
grep -F -v -f smallfile bigfile
我写了一个python脚本来生成一些测试数据:
bigfile = open('bigfile', 'w')
smallfile = open('smallfile', 'w')
count = 2000000
start = 1000000
for i in range(start, start + count):
bigfile.write('foo' + str(i) + 'bar\n')
if i % 2:
smallfile.write(str(i) + '\n')
bigfile.close()
smallfile.close()
以下是我仅使用 2000 行(将计数设置为 2000)运行的一些测试,因为对于更多行,运行 grep 所需的时间-F
变得荒谬。
$ time grep -v -f smallfile bigfile > /dev/null
real 0m3.075s
user 0m2.996s
sys 0m0.028s
$ time grep -F -v -f smallfile bigfile > /dev/null
real 0m0.011s
user 0m0.000s
sys 0m0.012s
--mmap
根据手册页,Grep 也有一个可以提高性能的开关。在我的测试中没有性能提升。
对于这些测试,我使用了 200 万行。
$ time grep -F -v -f smallfile bigfile > /dev/null
real 0m3.900s
user 0m3.736s
sys 0m0.104s
$ time grep -F --mmap -v -f smallfile bigfile > /dev/null
real 0m3.911s
user 0m3.728s
sys 0m0.128s