Awk入门
模式匹配(Pattern Matching)
正如你已经知道的,Awk 逐行扫描文件,对于匹配搜索模式的行,执行对应的语句块。到目前为止,我们使用的搜索模式非常简单,例如 /gold/
,但接下来,你将学习高级搜索模式。
本章介绍的搜索模式是 正则表达式(Regular Expressions),它们是一组规则,用于匹配特定的字符序列。
1. 简单模式
最简单的搜索模式是 一个字符串,用斜杠 /
括起来:
/The/
这个模式会匹配 任何包含 "The" 的行,但不会匹配 "the"
,因为 Awk 区分大小写。它也会匹配 "There"
和 "Them"
,因为这些单词包含 "The"
。
1.1 匹配行首
使用 ^
(脱字符) 匹配 以特定字符串开头 的行:
/^The/
示例(匹配所有以 "The" 开头的行):
The quick brown fox ✅ 匹配
There is a house ✅ 匹配
My name is Thelma ❌ 不匹配
1.2 匹配行尾
使用 $
(美元符号) 匹配 以特定字符串结尾 的行:
/The$/
示例(匹配所有以 "The" 结尾的行):
That is The ✅ 匹配
The book is mine ❌ 不匹配
1.3 匹配特殊字符
如果要匹配特殊字符(如 ^
或 $
),需要使用 \
(反斜杠) 进行转义:
/\$/
这将匹配包含 $
符号 的行。
2. 字符集匹配
2.1 匹配多个字符
使用 方括号 []
指定多个可选字符:
/[Tt]he/
这将匹配 "The" 或 "the",但不会匹配 "There"
。
也可以使用 字符范围:
/[a-z]/
匹配任何小写字母。
/[a-zA-Z0-9]/
匹配 字母(大小写)或数字。
2.2 取反匹配
如果 方括号内的第一个字符是 ^
,则匹配不包含这些字符的内容:
/^[^a-zA-Z0-9]/
这将匹配 不以字母或数字开头的行。
3. 逻辑或(Alternation)
使用 |
(竖线) 进行逻辑 OR(或) 操作:
/(^Germany)|(^Netherlands)/
匹配:
Germany won the match ✅ 匹配
Netherlands is beautiful ✅ 匹配
Italy is great ❌ 不匹配
4. 通配符(Wildcard)
.
(点号)匹配 任何单个字符:
/f.n/
匹配:
fan ✅ 匹配
fun ✅ 匹配
fin ✅ 匹配
fxn ✅ 匹配
但不匹配 "faun"
或 "foin"
(因为 .
只能匹配 一个 字符)。
5. 重复匹配
在 Awk 中,*
、+
和 ?
控制前一个字符的重复次数:
符号 | 作用 | 示例 | 匹配内容 |
---|---|---|---|
* |
0 或 多次 | /a*/ |
"", "a", "aa", "aaa" |
+ |
至少 1 次 | /a+/ |
"a", "aa", "aaa"(但不匹配 "") |
? |
0 或 1 次 | /a?/ |
"", "a" |
示例:
/(ab|c)*/
匹配:
ab ✅ 匹配
abab ✅ 匹配
ababab ✅ 匹配
c ✅ 匹配
cc ✅ 匹配
ccc ✅ 匹配
abc ✅ 匹配
ababc ✅ 匹配
6. 精确匹配重复次数
使用 {}
(大括号) 指定重复次数:
/f[eo]{2}t/
匹配:
foot ✅ 匹配
feet ✅ 匹配
fot ❌ 不匹配
匹配至少 3 位数字:
/[0-9]{3,}/
等价于:
/[0-9][0-9][0-9]+/
匹配 4 到 7 位数字:
/^[0-9]{4,7}$/
匹配:
1234 ✅ 匹配
567890 ✅ 匹配
1 ❌ 不匹配(太短)
12345678 ❌ 不匹配(太长)
7. 练习
如果你不熟悉正则表达式,请尝试编写一些表达式并测试它们。
-
匹配美国 ZIP 代码
5 位数字,或 5 位数字+连字符+4 位数字(如 12345 或 12345-6789)
/^[0-9]{5}(-[0-9]{4})?$/
-
匹配数字(包括小数)
允许整数或带小数点的数(如 123、45.6、0.78)
/^[+-]?[0-9]+(\.[0-9]+)?$/
-
匹配电子邮件地址
电子邮件格式:xxx@yyy.zzz(如 user_123@example.com)
/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
-
匹配电话号码
允许 (123) 456-7890、123-456-7890、1234567890
/^(\([0-9]{3}\)|[0-9]{3})[- ]?[0-9]{3}[- ]?[0-9]{4}$/
在下一章,你将学习更多 高级搜索模式 以及如何在 Awk 中结合模式匹配和数据处理。