如何将 grep 与文件和额外的正则表达式结合起来

如何将 grep 与文件和额外的正则表达式结合起来

我的每一行都有一个字符串文件。

例如:

AAAAA   
BBBBB   
CCCCC  
etc  

我想逐个检查每个字符串是否存在于特定目录中的一系列文件中。

我知道我可以做:grep -f filename进行搜索。但我需要的是每行再使用一个正则表达式来获得更具体的结果。包含字符串的文件很大并且经常更改,因此修改每一行以添加表达式是没有意义的。

所以我需要的是将grep -f filenameto 循环遍历文件的每一行(并在文件中对其进行 grep ),但添加更多条件。例如AAAAA存在 [0-9]{1,3}$也存在于同一行中。

答案1

您可以使用grep管道逐步执行此操作

grep -f your_file list_of_files|grep -E extra_condition

或者

while read line; do
    grep -E -e "$line" -e extra_condition list_of_files
done < your_file

在这两种情况下,-E如果您要使用以下形式的模式[0-9]{1,3}$(即包含数字量词),则需要切换。

编辑

感谢 Drav Sloan 的评论,我们知道第二个版本(循环while)不仅可以简化为

grep -E -e "extra_condition" -f your_file list_of_files

但它实际上寻找一种模式或者另一种不是一种模式另一个。您应该坚持使用第一种形式。

答案2

awk只是为了展示使用和 的替代方法grep

样本数据

$ cat patterns.txt 
AAAA
BBBB
CCCC
DDDD
EEEE

$ cat sample.txt 
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2
YYYY 1
YYYY 2

例子

awk #1:

$ awk 'FNR==NR{a[$0]; next}($1 in a)' patterns.txt sample.txt | grep -E "[0-9]{1,3}$"
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2

这很可能需要调整,但会提示您如何进行调整。

awk #2:

$ awk 'FNR==NR{a[$0];next};{for (i in a){if (match($0,i)) print}}' patterns.txt sample.txt | grep -E "[0-9]{1,3}$"
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2

这个更加灵活,它可以处理样本数据行内任何位置的模式字符串。

相关内容