使用 awk/sed/grep 按内容有效过滤许多文件

使用 awk/sed/grep 按内容有效过滤许多文件

我想(递归地)列出目录中第二行完全匹配某个正则表达式的所有文件。文件总数约为60K。

到目前为止,我编写了这个命令: find /path -type f | xargs --no-run-if-empty -n1000 awk 'FNR = 2 && $0 ~ /^regular expression$/ {print FILENAME; nextfile}'

能否提高效率?

答案1

首先要注意你错误地使用了=而不是正确的==

你不需要xargs,你可以直接运行find。另外,您awk应该在处理完第 2 行后立即退出,而不是读取整个文件。

find /path -type f -exec awk 'FNR == 2 && /^regular expression$/ {print FILENAME}; FNR == 2 {nextfile}' '{}' +

参数末尾+-exec指示find放置尽可能多的文件名参数。啦啦xargs。看find文档。

这里重要的一点是FNR==2 {nextfile}

是否-exec优于xargs(但使用-print0&-0如果可用)有待讨论。一方面,find … | xargs …允许在检查前一批find的同时读取更多文件名,从而实现一定程度的并行化。awk另一方面,并​​行化可能会导致坏磁盘与awk磁盘find的不同磁道相互竞争。您的硬件(缓存大小、SSD 等)将改变这一情况。配置文件然后决定。

答案2

你可以尝试:

grep -n <reg expr> /path/to/* | grep ":2:" | cut -d ':' -f1

只要:2:不是 的一部分<reg expr>

还有-x整线匹配。

不知道这是否更快 - 我没有 60k 个文件来测试:]

相关内容