在 Linux 系统里,正则表达式被广泛用于各种命令行工具,以实现强大的文本处理功能。例如:
grep
、egrep
等工具在文件中查找符合特定模式的文本。sed
、awk
等工具对文本进行替换和格式化操作。在 Linux 环境下,常见的正则表达式引擎有基本正则表达式(BRE)和扩展正则表达式(ERE)。
grep
)默认使用这种语法。其元字符的特殊含义需要通过转义字符(如 \
)来启用。egrep
、sed -r
、awk
等工具都支持 ERE。元字符 | 含义 | 示例(Linux 命令) | 运行结果 |
---|---|---|---|
. |
匹配除换行符以外的任意单个字符 | `echo “abc” | grep ‘a.c’` |
[] |
匹配方括号内指定的任意一个字符 | `echo “abc” | grep ‘[ab]c’` |
[^ ] |
匹配不在方括号内指定的任意一个字符 | `echo “abc” | grep ‘[^ab]c’` |
\d (ERE) |
匹配任意一个数字字符,等价于 [0-9] |
`echo “123” | egrep ‘\d+’` |
元字符 | 含义 | 示例(Linux 命令) | 运行结果 |
---|---|---|---|
* |
匹配前面的元素零次或多次 | `echo “abbb” | grep ‘ab*’` |
+ (ERE) |
匹配前面的元素一次或多次 | `echo “abbb” | egrep ‘ab+’` |
? (ERE) |
匹配前面的元素零次或一次 | `echo “ab” | egrep ‘ab?’` |
{n} (ERE) |
匹配前面的元素恰好 n 次 | `echo “aaa” | egrep ‘a{3}’` |
元字符 | 含义 | 示例(Linux 命令) | 运行结果 |
---|---|---|---|
^ |
匹配字符串的开头 | `echo “abc” | grep ‘^ab’` |
$ |
匹配字符串的结尾 | `echo “abc” | grep ‘bc$’` |
\b (ERE) |
匹配单词边界 | `echo “cat dog” | egrep ‘\bcat\b’` |
元字符 | 含义 | 示例(Linux 命令) | 运行结果 |
---|---|---|---|
() (ERE) |
用于分组,将多个元素视为一个整体,并可以对分组进行后向引用 | `echo “abab” | egrep ‘(ab)+’` |
\1 (ERE) |
后向引用,引用前面分组的匹配结果 | `echo “11” | egrep ‘(\d)\1’` |
grep
进行文本搜索test.txt
文件中查找包含数字的行。echo "abc
123
def" > test.txt
grep '[0-9]' test.txt
123
sed
进行文本替换test.txt
文件中所有的 abc
替换为 xyz
。echo "abc def" > test.txt
sed 's/abc/xyz/g' test.txt
xyz def
awk
进行数据提取test.txt
文件中提取每行的第一个字段。echo "apple banana
cherry date" > test.txt
awk '{print $1}' test.txt
apple
cherry
在 Linux 系统以及各类文本处理场景中,过滤器是极为实用的工具。它们能够接收输入文本,依据特定规则对其进行处理,并输出处理后的结果。grep
、awk
和 sed
是其中最为常用的三个过滤器,它们在文本搜索、提取、替换等操作上各有所长。通过正则表达式与这些过滤器的结合,能够高效地完成复杂的文本处理任务。
grep
(Global Regular Expression Print)主要用于在文件或标准输入中查找符合指定正则表达式模式的行,并将匹配的行输出。它支持基本正则表达式(BRE)和扩展正则表达式(ERE),可以通过选项指定使用哪种模式。
假设存在一个名为 test.txt
的文件,其内容如下:
apple
banana
cherry
date
a
的行grep 'a' test.txt
A
的行grep -i 'A' test.txt
a
的行grep -v 'a' test.txt
grep 'a' test.txt
的输出:apple
banana
date
grep -i 'A' test.txt
的输出:apple
banana
date
grep -v 'a' test.txt
的输出:cherry
awk
是一种功能强大的文本处理语言,它以行为单位处理文本数据,将每行拆分为多个字段(默认以空格或制表符分隔),然后可以对这些字段进行各种操作。其基本语法为 awk 'pattern { action }' file
,其中 pattern
是可选的匹配条件,action
是匹配成功后执行的操作。
假设存在一个名为 data.txt
的文件,内容如下:
John 25 Male
Alice 22 Female
Bob 30 Male
awk '{ print $1 }' data.txt
awk '$2 > 25 { print $0 }' data.txt
awk '{ print $1 }' data.txt
的输出:John
Alice
Bob
awk '$2 > 25 { print $0 }' data.txt
的输出:Bob 30 Male
awk
有许多内置变量,如 $0
表示整行内容,$1
、$2
… 表示每行的第 1 个、第 2 个 … 字段,NF
表示当前行的字段数,NR
表示当前行的行号。此外,awk
还支持自定义函数和复杂的条件判断。
awk '{ print NF }' data.txt
awk '
function sum_age(total, age) {
return total + age;
}
{
total = sum_age(total, $2);
}
END {
print "年龄总和: " total;
}
' data.txt
awk '{ print NF }' data.txt
的输出:3
3
3
awk 'function sum_age(total, age) { return total + age; } { total = sum_age(total, $2); } END { print "年龄总和: " total; }' data.txt
的输出:年龄总和: 77
sed
(Stream Editor)是一种流编辑器,用于对文本进行替换、删除、插入等操作。它逐行读取输入文本,根据指定的命令对每行进行处理,并将处理结果输出。基本语法为 sed 'command' file
。
假设存在一个名为 text.txt
的文件,内容如下:
Hello, World!
This is a test.
is
替换为 was
sed 's/is/was/g' text.txt
test
的行sed '/test/d' text.txt
sed 's/is/was/g' text.txt
的输出:Hello, World!
Thwas was a test.
sed '/test/d' text.txt
的输出:Hello, World!
sed
可以指定处理的行范围,支持多行操作,还可以将命令写在脚本文件中。使用 N
命令可以将下一行追加到当前行进行处理。
is
为 was
sed '2 s/is/was/' text.txt
replace.sed
并执行# replace.sed 文件内容
s/is/was/g
sed -f replace.sed text.txt
sed '2 s/is/was/' text.txt
的输出:Hello, World!
Thwas is a test.
sed -f replace.sed text.txt
的输出:Hello, World!
Thwas was a test.
过滤器 | 知识点 | 代码示例 | 运行结果 |
---|---|---|---|
grep | 查找匹配行,支持 BRE 和 ERE,可通过选项控制 | grep 'a' test.txt grep -i 'A' test.txt grep -v 'a' test.txt |
包含 a 的行 忽略大小写包含 A 的行 不包含 a 的行 |
awk(基本) | 按行处理文本,拆分字段,执行操作 | awk '{ print $1 }' data.txt awk '$2 > 25 { print $0 }' data.txt |
每行第一个字段 年龄大于 25 岁的人的信息 |
awk(深入) | 内置变量、自定义函数、复杂条件判断 | awk '{ print NF }' data.txt awk 'function sum_age(total, age) { return total + age; } { total = sum_age(total, $2); } END { print "年龄总和: " total; }' data.txt |
每行字段数 年龄总和 |
sed(基本) | 文本替换、删除操作 | sed 's/is/was/g' text.txt sed '/test/d' text.txt |
替换 is 为 was 删除包含 test 的行 |
sed(深入) | 指定行范围、多行操作、脚本文件 | sed '2 s/is/was/' text.txt sed -f replace.sed text.txt |
只替换第 2 行的 is 为 was 按脚本文件替换 is 为 was |