仅打印一次包含字符串的行

Print lines that contain a string only once

例如这是我的文件 Weapons:

Sword of Dragons
Staff of Fire
Bow of Noxious
Staff of Light
Bow of Noxious

我想输入一个命令,只显示一次包含 Bow 的行。

这是我尝试过的:

grep -n "Bow" Weapons

但它只显示所有包含 Bow 的行。如何只显示一次包含 Bow 的行?

您可以在排序命令中使用内置选项:

sort -u file | grep -i bow

或者如果您坚持使用唯一

sort file | uniq  | grep -i bow

您可以使用 Bow 作为 awk 中的字段分隔符,如果这导致一行中有 2 个字段,则只打印:

awk -F"Bow" 'NF==2' file

如果您不想区分大小写,请使用 IGNORECASE=1

为了匹配准确的单词(例如Bow而不是bowtie),你可以使用GNU awk,感谢Ed Morton的建议,< > 锚点以指示单词的限制(如其他语言中的 \b):

awk -F'\<Bow\>' 'BEGIN {IGNORECASE=1} NF==2' a

测试

$ cat a
Sword of Dragons
Staff of Fire
Bow of Noxious
Staff of Light
Bow I like Bow
this is a bow
and this a bowtie
$ awk -F"Bow" 'NF==2' a
Bow of Noxious
$ awk -F"Bow" 'BEGIN {IGNORECASE=1} NF==2' a
Bow of Noxious
this is a bow
and this a bowtie
$ awk -F'\<Bow\>' 'BEGIN {IGNORECASE=1} NF==2' a
Bow of Noxious
this is a bow