这里写目录标题
目录:
1. 背景知识
1.1 正则表达式在 Linux 中的应用场景
在 Linux 系统里,正则表达式被广泛用于各种命令行工具,以实现强大的文本处理功能。例如:
- 文件搜索:使用
grep
、egrep
等工具在文件中查找符合特定模式的文本。 - 文本替换:借助
sed
、awk
等工具对文本进行替换和格式化操作。 - 数据提取:从日志文件、配置文件等大量文本数据中提取所需信息。
1.2 正则表达式引擎类型
在 Linux 环境下,常见的正则表达式引擎有基本正则表达式(BRE)和扩展正则表达式(ERE)。
- 基本正则表达式(BRE):是最基础的正则表达式语法,一些传统的工具(如早期的
grep
)默认使用这种语法。其元字符的特殊含义需要通过转义字符(如\
)来启用。 - 扩展正则表达式(ERE):功能更强大,支持更多的元字符和语法,像
egrep
、sed -r
、awk
等工具都支持 ERE。
2. 元字符
2.1 字符匹配元字符
元字符 | 含义 | 示例(Linux 命令) | 运行结果 |
---|---|---|---|
. |
匹配除换行符以外的任意单个字符 | `echo “abc” | grep ‘a.c’` |
[] |
匹配方括号内指定的任意一个字符 | `echo “abc” | grep ‘[ab]c’` |
[^ ] |
匹配不在方括号内指定的任意一个字符 | `echo “abc” | grep ‘[^ab]c’` |
\d (ERE) |
匹配任意一个数字字符,等价于 [0-9] |
`echo “123” | egrep ‘\d+’` |
2.2 数量限定元字符
元字符 | 含义 | 示例(Linux 命令) | 运行结果 |
---|---|---|---|
* |
匹配前面的元素零次或多次 | `echo “abbb” | grep ‘ab*’` |
+ (ERE) |
匹配前面的元素一次或多次 | `echo “abbb” | egrep ‘ab+’` |
? (ERE) |
匹配前面的元素零次或一次 | `echo “ab” | egrep ‘ab?’` |
{n} (ERE) |
匹配前面的元素恰好 n 次 | `echo “aaa” | egrep ‘a{3}’` |
2.3 位置限定元字符
元字符 | 含义 | 示例(Linux 命令) | 运行结果 |
---|---|---|---|
^ |
匹配字符串的开头 | `echo “abc” | grep ‘^ab’` |
$ |
匹配字符串的结尾 | `echo “abc” | grep ‘bc$’` |
\b (ERE) |
匹配单词边界 | `echo “cat dog” | egrep ‘\bcat\b’` |
2.4 分组和引用元字符
元字符 | 含义 | 示例(Linux 命令) | 运行结果 |
---|---|---|---|
() (ERE) |
用于分组,将多个元素视为一个整体,并可以对分组进行后向引用 | `echo “abab” | egrep ‘(ab)+’` |
\1 (ERE) |
后向引用,引用前面分组的匹配结果 | `echo “11” | egrep ‘(\d)\1’` |
3. 其他
3.1 使用 grep
进行文本搜索
- 代码示例:在
test.txt
文件中查找包含数字的行。
echo "abc
123
def" > test.txt
grep '[0-9]' test.txt
- 运行结果:
123
3.2 使用 sed
进行文本替换
- 代码示例:将
test.txt
文件中所有的abc
替换为xyz
。
echo "abc def" > test.txt
sed 's/abc/xyz/g' test.txt
- 运行结果:
xyz def
3.3 使用 awk
进行数据提取
- 代码示例:从
test.txt
文件中提取每行的第一个字段。
echo "apple banana
cherry date" > test.txt
awk '{print $1}' test.txt
- 运行结果:
apple
cherry
1. 前言
在 Linux 系统以及各类文本处理场景中,过滤器是极为实用的工具。它们能够接收输入文本,依据特定规则对其进行处理,并输出处理后的结果。grep
、awk
和 sed
是其中最为常用的三个过滤器,它们在文本搜索、提取、替换等操作上各有所长。通过正则表达式与这些过滤器的结合,能够高效地完成复杂的文本处理任务。
2. 过滤器 grep
知识点
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
3. 过滤器 awk
3.1 基本概念
知识点
awk
是一种功能强大的文本处理语言,它以行为单位处理文本数据,将每行拆分为多个字段(默认以空格或制表符分隔),然后可以对这些字段进行各种操作。其基本语法为 awk 'pattern { action }' file
,其中 pattern
是可选的匹配条件,action
是匹配成功后执行的操作。
代码示例
假设存在一个名为 data.txt
的文件,内容如下:
John 25 Male
Alice 22 Female
Bob 30 Male
- 打印每行的第一个字段(姓名)
awk '{ print $1 }' data.txt
- 打印年龄大于 25 岁的人的信息
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
3.2 深入理解
知识点
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
4. 过滤器 sed
4.1 基本概念
知识点
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!
4.2 深入理解
知识点
sed
可以指定处理的行范围,支持多行操作,还可以将命令写在脚本文件中。使用 N
命令可以将下一行追加到当前行进行处理。
代码示例
- 只替换第 2 行中的
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 |