在Linux中精确使用grep -f命令

9
我在Linux中有两个txt文件。
A.txt的内容(每行都包含一个数字):
1
2
3

B.txt的内容(每行都包含一个数字):
1
2
3
10
20
30

grep -f A.txt B.txt的结果如下:

1
2
3
10
20
30

是否有一种方式进行grep,以便我仅获取精确匹配,即不是10、20、30等?谢谢。
4个回答

14

要使用精确匹配请使用 -x 开关

grep -x -f A.txt B.txt 
编辑: 如果你不想使用grep的正则表达式功能,且希望将搜索模式视为固定字符串,则可以使用-F开关,如下所示:
grep -xF -f A.txt B.txt

     -x, --line-regexp
             Only input lines selected against an entire fixed string or regular expression are considered to be matching lines.

3
并在输入时添加-F以禁用元字符。例如,使用-Ffgrep选项,3.14也会匹配3124 - tripleee
@tripleee:非常感谢,我会把它加入到我的答案中。 - anubhava
@tripleee 我认为你的意思是3.14也可以匹配3214,而不是3124。 - shiri
1
这正是我需要的,可以过滤出一个确切的名称,但不包括它作为前缀时的情况。 - Sridhar Sarnobat

4

尝试添加-w标志:

grep -wf A.txt B.txt

这将给您精确的结果,即在以下范围内: 1 2 3

谢谢

     -w, --word-regexp
             The expression is searched for as a word (as if surrounded by ‘[[:<:]]’ and ‘[[:>:]]; see re_format(7)).  This option has no effect if -x is also specified.

4

正如anubhava所指出的那样,grep -x将匹配整行。还有另一个开关-w用于匹配单词。因此,如果A.txt中的单词与B.txt中的单词匹配,则grep -wf A.txt B.txt将显示匹配项。


-2
你可以尝试识别文件名和其所包含的不同内容。
  # cat a.txt
  1
  2
  3
  # cat b.txt
  1
  2
  3
  10
  20
  30
  # grep -L a.txt b.txt
  b.txt

这个问题写得很清楚,特别要求只获取两个文件之间匹配的行。你的答案没有涵盖这一点。 - Lucio Mollinedo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接