虽然表面上这似乎是一个简单的问题,但实际上并不是因为两个因素:
-
pattern 这个词不明确 - 我们不知道 OP 是要进行正则表达式匹配还是字符串匹配,并且
-
match 这个词是模棱两可的 - 我们不知道 OP 是否希望在每一行上进行完全匹配(考虑 line 和 record 同义词以简化此答案)或对特定子字符串进行完全匹配(例如“词”或字段)在一行或每行的一部分或其他内容的部分匹配。
其中任何一个都会从发布的示例输入中产生预期的输出:
awk '/o.b/' file
awk '/^o.b$/' file
awk 'index($0,"o.b")' file
awk '$0 == "o.b"' file
但我们不知道哪个是正确的,如果有的话,我们只知道它们从问题中的特定样本输入产生预期的输出。
如果 OP 的真实数据包含像这样的额外字符串,而不仅仅是问题中显示的最小示例,请考虑每个人的行为:
$ cat file
foo
foo.bar
foobar
o.b
orb
bar
那么这里有 4 个可能的答案,在给定问题的样本输入的情况下,它们都会产生预期的输出,但在输入略有不同的情况下会产生非常不同的输出,而且我们无法从问题中知道哪个输出会满足 OP 的需求:
- 部分正则表达式匹配:
$ awk '/o.b/' file
foo.bar
foobar
o.b
orb
- 全行正则表达式匹配:
$ awk '/^o.b$/' file
o.b
orb
- 部分字符串匹配:
$ awk 'index($0,"o.b")' file
foo.bar
o.b
- 整行字符串匹配:
$ awk '$0 == "o.b"' file
o.b
当您考虑针对每行上的特定子字符串进行全字、全字段和其他类型的匹配时,还有各种其他可能性也可能是正确答案。
因此,每当您询问有关将某些文本与其他文本匹配的问题时:
- 永远不要使用
pattern这个词,而是使用string或regexp,无论你是什么意思,并且
- 始终说明您希望匹配是整行还是行的一部分或完整的子字符串(例如单词或字段)或行的子字符串的一部分。
否则,您最终可能会找到解决您没有的问题的解决方案,该解决方案可能效率低下和/或完全错误,即使它为您现在运行的某些特定输入集产生预期输出,它也可能稍后在与其他输入集运行时回来咬你。
有关此问题的更多示例,另请参阅 https://unix.stackexchange.com/a/631532/133219。