有选择地 grep

有选择地 grep

我有一个包含 1000 多个指示符的文件,这些指示符来自我使用的 bash

for desig in $(desfile)
do
  grep $desig in listfile
done

listfile可以每100万+行,所以速度很重要

问题在于像这样的指示符

PA0EHH
DL/PA0EHH

PA0EHH发现两次

我发现 awk 可以更具选择性,但速度慢得令人痛苦。

答案1

grep -xF -f desfile listfile

或者,如果desfile是命令,

grep -xF -f <(desfile) listfile

或者,

desfile | grep -xF -f /dev/stdin listfile

这里使用的选项是

  • -x,需要在一条线的整个长度上进行匹配。这就是您想要用来不匹配行上的子字符串的方法。
  • -F,使用字符串比较而不是正则表达式匹配。这将加快查询速度,如果您的模式包含正则表达式中的特殊字符(而不希望它们变得特殊),那么这将是必要的。
  • -f filename,从文件而不是从命令行上的字符串读取模式。这适用于适量的模式。如果你有很多许多模式,您可能会耗尽内存,在这种情况下,您可能需要使用将(或命令的desfile输出)拆分为几个较小的文件,然后迭代这些文件。无论如何,你都会desfilesplit不是grep为每个模式调用一次!

答案2

如果您正在检查您的指示符是否是每行的开头,您可以

grep ^$desig listfile

如果您想将其限制为第一次点击,请添加 switch -m 1
如果您需要更细粒度的搜索,请尝试正则表达式:

testval=2
seq 40 | grep -e ^$testval\\b
seq 40 | grep -e \\b$testval\\b

两者完全匹配 2,具体取决于您的用例。并防止 grep 识别例如2/2

echo "2/2 2" | grep -e [^\/]\\b$testval\\b

我的 bash 中只有孤独 2 的颜色。

答案3

由于性能是一个问题,因此考虑使用ripgrep,它的基准测试比grep许多情况下更快。

相关内容