如何使用 grep 比较一个 .txt 文档中的任何行是否出现在另一个文档中?
此外,我将如何使用 grep 找出相反的结果?可不可能是grep -v
?
答案1
grep -F -f inner_file outer_file
文档中参数的解释GNU grep:
-F
,--fixed-strings
将模式解释为由换行符分隔的固定字符串列表,其中任何一个都将被匹配。 (
-F
由 POSIX 指定。)
-f file
,--file=file
从文件中获取模式,每行一个。空文件包含零个模式,因此不匹配任何内容。 (
-f
由 POSIX 指定。)
您可能还想使用以下-x
选项:
-x
,--line-regexp
仅选择那些与整行完全匹配的匹配项。 (
-x
由 POSIX 指定。)
添加-v
选项以找出相反的结果:
-v
,--invert-match
反转匹配的意义,以选择不匹配的行。 (
-v
由 POSIX 指定。)
使用 Bash shell 进行快速测试:
# grep -F -f <(printf 'A\nZ\n') <(printf 'A\nB\nC\n')
A
# echo $?
0
# grep -F -f <(printf 'A\nZ\n') <(printf 'B\nC\n')
# echo $?
1
# grep -v -F -f <(printf 'A\nZ\n') <(printf 'B\nC\n')
B
C
# echo $?
0
# grep -x -F -f <(printf 'A\nZ\n') <(printf 'AA\nBB\nCC\n')
# echo $?
1
答案2
我测试了与您的问题类似的问题并得出以下结论:
cat sampleOne.txt | cat sampleTwo.txt | grep <pattern>
例如,我在文本文件中写了这样的内容:
This is a test.
1111
2222
当我专门寻找“这是一个测试”时,我使用了
cat *.txt | grep "This is a test."
This is a test.
This is a test.
或者
cat sampleOne.txt && cat sampleTwo.txt | grep "This is a test."
结果:
This is a test.
11111
22222
This is a test.
甚至
cat sampleOne.txt | cat sampleTwo.txt | grep "This is a test"
这让我:
This is a test.
该命令grep -v pattern
当然会找到您正在寻找的模式的逆模式。例如
cat *.txt | grep -v "This is a test."
会给我:
11111
22222
11111
22222