如何在 2 个文件中进行 grep 精确字符串匹配

how to grep exact string match across 2 files

我有 UTF-8 纯文本用户名列表,每行 1 个,在 list1.txtlist2.txt 中。请注意,在相关情况下,用户名可能包含正则表达式字符,例如! ^ . ( 等以及空格。

我想获取并保存到 matches.txt 两个 列表中出现的所有唯一值的列表。我的命令行专业知识很少,但这几乎让我成功了:

grep -Ff list1.txt list2.txt > matches.txt

...但这是将 "jdoe""jdoe III" 视为匹配项,返回 "jdoe III" 作为匹配值。这对于任务来说是不正确的。我需要每行模式匹配是 whole 行,即从 ^ 到 $。我试过添加 -x 标志,但根本没有匹配项(编辑:查看已接受答案的评论 - 我把标志顺序弄错了)。

我在 OS X 10.9.5 上,我不必使用 grep - 另一个解决问题的命令行(工具)就可以了。

这个 awk 比这里的 grep 更方便:

awk 'FNR==NR{a[[=10=]]; next} [=10=] in a' list1.txt list2.txt > matches.txt

[=13=]是行,FNR是当前文件的当前行号,NR是总行号(只有在第一个文件)。 a[[=16=]] 是一个关联数组(哈希),其键是行。 next 将确保进一步的子句([=18=] in a)不会 运行 如果当前子句(这是第一个文件的事实)做到了。当当前行在数组 a 中有一个值时,[=18=] in a 将为真,因此只会显示两者中都存在的行。该顺序将是它们在第二个文件中出现的顺序。

您需要做的就是将 -x 标记添加到您的 grep 查询中:

grep -Fxf list1.txt list2.txt > matches.txt

-x 标志将匹配限制为整行匹配(每个 PATTERN 变为 ^PATTERN$)。我不确定为什么您尝试 -x 失败了。也许你把它放在 -f 之后,它必须紧跟第一个文件?

一种非常简单直接的方法,不需要用 grep 做各种疯狂的事情,如下所示

cat list1.txt list2.txt|grep match > matches.txt
不仅如此,它也更容易记住,(尤其是如果你经常使用 cat)。

grep -Fwf file1 file2 将逐字匹配!!