選擇性地 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許多情況下更快。

相關內容