在 awk 中,正则表达式匹配是一个非常强大的功能。可以使用正则表达式来筛选、匹配行或字段内容。awk 支持使用 /pattern/ 的语法来匹配数据。
awk '/pattern/ { action }' file
/pattern/:匹配特定的正则表达式。{ action }:当匹配到时要执行的操作。假设文件 log.txt 内容如下:
INFO: Everything is working
ERROR: Something went wrong
WARNING: Disk space low
ERROR: Failed to start service
要匹配并打印包含 ERROR 的行:
awk '/ERROR/ { print $0 }' log.txt
输出:
ERROR: Something went wrong
ERROR: Failed to start service
可以对某一特定字段进行正则匹配。例如,只匹配第一列包含特定字符串的行。
假设文件 data.txt 内容如下:
John 85
Doe 60
Alice 75
Bob 90
可以匹配第一列中包含 “John” 的行:
awk '$1 ~ /John/ { print $0 }' data.txt
输出:
John 85
!~ 用于匹配不符合正则表达式的行。
awk '!/ERROR/ { print $0 }' log.txt
输出:
INFO: Everything is working
WARNING: Disk space low
awk '$1 !~ /John/ { print $0 }' data.txt
输出:
Doe 60
Alice 75
Bob 90
.:匹配任意单个字符。*:匹配前面的字符零次或多次。+:匹配前面的字符一次或多次。^:匹配行首。$:匹配行尾。[abc]:匹配字符 a, b, 或 c。[a-z]:匹配从 a 到 z 之间的任意字符。[^abc]:匹配除 a, b, c 以外的任意字符。awk '/^ERROR/ { print $0 }' log.txt
输出:
ERROR: Something went wrong
ERROR: Failed to start service
假设文件 data.txt 内容如下:
John 85
Doe 60
Alice 75A
Bob 90
匹配以数字结尾的行:
awk '/[0-9]$/ { print $0 }' data.txt
输出:
John 85
Doe 60
Bob 90
假设文件 text.txt 内容如下:
abc
a123b
cxyz
foo
匹配包含 a 和 b 之间有任意字符的行:
awk '/a.*b/' text.txt
输出:
a123b
awk 功能使用要统计匹配特定正则表达式的行数,可以结合 END 使用:
awk '/ERROR/ { count++ } END { print "Total ERROR lines:", count }' log.txt
输出:
Total ERROR lines: 2