在 Linux 中,你可以使用 grep
、awk
或 comm
命令来找出 b.txt
中存在但 a.txt
中不存在的行,并打印到终端。以下是几种方法:
方法 1:使用 grep
(推荐)
grep -vxFf a.txt b.txt
解释:
-v
:反向匹配,显示不匹配的行。-x
:整行匹配(避免部分匹配)。-F
:将模式视为固定字符串(而非正则表达式,提高速度)。-f a.txt
:从a.txt
读取匹配模式。b.txt
:要搜索的文件。
示例:
$ cat a.txt
apple
banana
orange
$ cat b.txt
banana
grape
orange
pear
$ grep -vxFf a.txt b.txt
grape
pear
方法 2:使用 awk
awk 'NR==FNR {a[$0]; next} !($0 in a)' a.txt b.txt
解释:
NR==FNR
:处理第一个文件(a.txt
)时,记录所有行到数组a
。next
:跳过后续操作,继续读取a.txt
。!($0 in a)
:处理第二个文件(b.txt
)时,如果当前行不在数组a
中,则打印。
示例:
$ awk 'NR==FNR {a[$0]; next} !($0 in a)' a.txt b.txt
grape
pear
方法 3:使用 comm
(需先排序)
comm -23 <(sort b.txt) <(sort a.txt)
解释:
comm
:比较两个已排序的文件。-23
:-2
:隐藏a.txt
独有的行。-3
:隐藏两个文件共有的行。最终只显示
b.txt
独有的行。
<(sort ...)
:进程替换,先对文件排序。
示例:
$ comm -23 <(sort b.txt) <(sort a.txt)
grape
pear
总结
推荐使用 grep
方法,因为它最简单且性能较好。