awk命令 - II

AWK的正则表达式过滤

awk 中,正则表达式匹配是一个非常强大的功能。可以使用正则表达式来筛选、匹配行或字段内容。awk 支持使用 /pattern/ 的语法来匹配数据。

1. 基本正则表达式匹配

awk '/pattern/ { action }' file
  • /pattern/:匹配特定的正则表达式。
  • { action }:当匹配到时要执行的操作。

示例1:匹配包含 “error” 的行

假设文件 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

2. 正则匹配字段

可以对某一特定字段进行正则匹配。例如,只匹配第一列包含特定字符串的行。

示例2:匹配第一列包含 “John” 的行

假设文件 data.txt 内容如下:

John 85
Doe 60
Alice 75
Bob 90

可以匹配第一列中包含 “John” 的行:

awk '$1 ~ /John/ { print $0 }' data.txt

输出:

John 85

3. 否定正则匹配

!~ 用于匹配不符合正则表达式的行。

示例3:排除包含 “ERROR” 的行

awk '!/ERROR/ { print $0 }' log.txt

输出:

INFO: Everything is working
WARNING: Disk space low

示例4:排除第一列包含 “John” 的行

awk '$1 !~ /John/ { print $0 }' data.txt

输出:

Doe 60
Alice 75
Bob 90

4. 正则表达式的常用符号

  • .:匹配任意单个字符。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ^:匹配行首。
  • $:匹配行尾。
  • [abc]:匹配字符 a, b, 或 c
  • [a-z]:匹配从 az 之间的任意字符。
  • [^abc]:匹配除 a, b, c 以外的任意字符。

5. 更复杂的正则表达式示例

示例5:匹配以 “ERROR” 开头的行

awk '/^ERROR/ { print $0 }' log.txt

输出:

ERROR: Something went wrong
ERROR: Failed to start service

示例6:匹配以数字结尾的行

假设文件 data.txt 内容如下:

John 85
Doe 60
Alice 75A
Bob 90

匹配以数字结尾的行:

awk '/[0-9]$/ { print $0 }' data.txt

输出:

John 85
Doe 60
Bob 90

示例7:匹配包含任意字符的行

假设文件 text.txt 内容如下:

abc
a123b
cxyz
foo

匹配包含 ab 之间有任意字符的行:

awk '/a.*b/' text.txt

输出:

a123b

6. 结合其他 awk 功能使用

示例8:统计匹配的行数

要统计匹配特定正则表达式的行数,可以结合 END 使用:

awk '/ERROR/ { count++ } END { print "Total ERROR lines:", count }' log.txt

输出:

Total ERROR lines: 2