![如何将 grep 与文件和额外的正则表达式结合起来](https://linux22.com/image/45840/%E5%A6%82%E4%BD%95%E5%B0%86%20grep%20%E4%B8%8E%E6%96%87%E4%BB%B6%E5%92%8C%E9%A2%9D%E5%A4%96%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%BB%93%E5%90%88%E8%B5%B7%E6%9D%A5.png)
我的每一行都有一个字符串文件。
例如:
AAAAA
BBBBB
CCCCC
etc
我想逐个检查每个字符串是否存在于特定目录中的一系列文件中。
我知道我可以做:grep -f filename
进行搜索。但我需要的是每行再使用一个正则表达式来获得更具体的结果。包含字符串的文件很大并且经常更改,因此修改每一行以添加表达式是没有意义的。
所以我需要的是将grep -f filename
to 循环遍历文件的每一行(并在文件中对其进行 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
这个更加灵活,它可以处理样本数据行内任何位置的模式字符串。