【正则表达式】

这里写目录标题

  • 目录:
      • [1. 背景知识](#1. 背景知识)
        • [1.1 正则表达式在 Linux 中的应用场景](#1.1 正则表达式在 Linux 中的应用场景)
        • [1.2 正则表达式引擎类型](#1.2 正则表达式引擎类型)
      • [2. 元字符](#2. 元字符)
        • [2.1 字符匹配元字符](#2.1 字符匹配元字符)
        • [2.2 数量限定元字符](#2.2 数量限定元字符)
        • [2.3 位置限定元字符](#2.3 位置限定元字符)
        • [2.4 分组和引用元字符](#2.4 分组和引用元字符)
      • [3. 其他](#3. 其他)
        • [3.1 使用 `grep` 进行文本搜索](#3.1 使用 grep 进行文本搜索)
        • [3.2 使用 `sed` 进行文本替换](#3.2 使用 sed 进行文本替换)
        • [3.3 使用 `awk` 进行数据提取](#3.3 使用 awk 进行数据提取)
      • [1. 前言](#1. 前言)
      • [2. 过滤器 grep](#2. 过滤器 grep)
      • [3. 过滤器 awk](#3. 过滤器 awk)
      • [4. 过滤器 sed](#4. 过滤器 sed)
      • 表格总结

目录:

1. 背景知识

1.1 正则表达式在 Linux 中的应用场景

在 Linux 系统里,正则表达式被广泛用于各种命令行工具,以实现强大的文本处理功能。例如:

  • 文件搜索 :使用 grepegrep 等工具在文件中查找符合特定模式的文本。
  • 文本替换 :借助 sedawk 等工具对文本进行替换和格式化操作。
  • 数据提取:从日志文件、配置文件等大量文本数据中提取所需信息。
1.2 正则表达式引擎类型

在 Linux 环境下,常见的正则表达式引擎有基本正则表达式(BRE)和扩展正则表达式(ERE)。

  • 基本正则表达式(BRE) :是最基础的正则表达式语法,一些传统的工具(如早期的 grep)默认使用这种语法。其元字符的特殊含义需要通过转义字符(如 \)来启用。
  • 扩展正则表达式(ERE) :功能更强大,支持更多的元字符和语法,像 egrepsed -rawk 等工具都支持 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 文件中查找包含数字的行。
bash 复制代码
echo "abc
123
def" > test.txt
grep '[0-9]' test.txt
  • 运行结果
plaintext 复制代码
123
3.2 使用 sed 进行文本替换
  • 代码示例 :将 test.txt 文件中所有的 abc 替换为 xyz
bash 复制代码
echo "abc def" > test.txt
sed 's/abc/xyz/g' test.txt
  • 运行结果
plaintext 复制代码
xyz def
3.3 使用 awk 进行数据提取
  • 代码示例 :从 test.txt 文件中提取每行的第一个字段。
bash 复制代码
echo "apple banana
cherry date" > test.txt
awk '{print $1}' test.txt
  • 运行结果
plaintext 复制代码
apple
cherry

1. 前言

在 Linux 系统以及各类文本处理场景中,过滤器是极为实用的工具。它们能够接收输入文本,依据特定规则对其进行处理,并输出处理后的结果。grepawksed 是其中最为常用的三个过滤器,它们在文本搜索、提取、替换等操作上各有所长。通过正则表达式与这些过滤器的结合,能够高效地完成复杂的文本处理任务。

2. 过滤器 grep

知识点

grep(Global Regular Expression Print)主要用于在文件或标准输入中查找符合指定正则表达式模式的行,并将匹配的行输出。它支持基本正则表达式(BRE)和扩展正则表达式(ERE),可以通过选项指定使用哪种模式。

代码示例

假设存在一个名为 test.txt 的文件,其内容如下:

plaintext 复制代码
apple
banana
cherry
date
  • 查找包含字母 a 的行
bash 复制代码
grep 'a' test.txt
  • 忽略大小写查找包含字母 A 的行
bash 复制代码
grep -i 'A' test.txt
  • 反向查找,输出不包含字母 a 的行
bash 复制代码
grep -v 'a' test.txt
运行结果
  • grep 'a' test.txt 的输出:
plaintext 复制代码
apple
banana
date
  • grep -i 'A' test.txt 的输出:
plaintext 复制代码
apple
banana
date
  • grep -v 'a' test.txt 的输出:
plaintext 复制代码
cherry

3. 过滤器 awk

3.1 基本概念
知识点

awk 是一种功能强大的文本处理语言,它以行为单位处理文本数据,将每行拆分为多个字段(默认以空格或制表符分隔),然后可以对这些字段进行各种操作。其基本语法为 awk 'pattern { action }' file,其中 pattern 是可选的匹配条件,action 是匹配成功后执行的操作。

代码示例

假设存在一个名为 data.txt 的文件,内容如下:

plaintext 复制代码
John 25 Male
Alice 22 Female
Bob 30 Male
  • 打印每行的第一个字段(姓名)
bash 复制代码
awk '{ print $1 }' data.txt
  • 打印年龄大于 25 岁的人的信息
bash 复制代码
awk '$2 > 25 { print $0 }' data.txt
运行结果
  • awk '{ print $1 }' data.txt 的输出:
plaintext 复制代码
John
Alice
Bob
  • awk '$2 > 25 { print $0 }' data.txt 的输出:
plaintext 复制代码
Bob 30 Male
3.2 深入理解
知识点

awk 有许多内置变量,如 $0 表示整行内容,$1$2 ... 表示每行的第 1 个、第 2 个 ... 字段,NF 表示当前行的字段数,NR 表示当前行的行号。此外,awk 还支持自定义函数和复杂的条件判断。

代码示例
  • 打印每行的字段数
bash 复制代码
awk '{ print NF }' data.txt
  • 自定义函数计算年龄总和
bash 复制代码
awk '
function sum_age(total, age) {
    return total + age;
}
{
    total = sum_age(total, $2);
}
END {
    print "年龄总和: " total;
}
' data.txt
运行结果
  • awk '{ print NF }' data.txt 的输出:
plaintext 复制代码
3
3
3
  • awk 'function sum_age(total, age) { return total + age; } { total = sum_age(total, $2); } END { print "年龄总和: " total; }' data.txt 的输出:
plaintext 复制代码
年龄总和: 77

4. 过滤器 sed

4.1 基本概念
知识点

sed(Stream Editor)是一种流编辑器,用于对文本进行替换、删除、插入等操作。它逐行读取输入文本,根据指定的命令对每行进行处理,并将处理结果输出。基本语法为 sed 'command' file

代码示例

假设存在一个名为 text.txt 的文件,内容如下:

plaintext 复制代码
Hello, World!
This is a test.
  • 将每行中的 is 替换为 was
bash 复制代码
sed 's/is/was/g' text.txt
  • 删除包含 test 的行
bash 复制代码
sed '/test/d' text.txt
运行结果
  • sed 's/is/was/g' text.txt 的输出:
plaintext 复制代码
Hello, World!
Thwas was a test.
  • sed '/test/d' text.txt 的输出:
plaintext 复制代码
Hello, World!
4.2 深入理解
知识点

sed 可以指定处理的行范围,支持多行操作,还可以将命令写在脚本文件中。使用 N 命令可以将下一行追加到当前行进行处理。

代码示例
  • 只替换第 2 行中的 iswas
bash 复制代码
sed '2 s/is/was/' text.txt
  • 创建脚本文件 replace.sed 并执行
plaintext 复制代码
# replace.sed 文件内容
s/is/was/g
bash 复制代码
sed -f replace.sed text.txt
运行结果
  • sed '2 s/is/was/' text.txt 的输出:
plaintext 复制代码
Hello, World!
Thwas is a test.
  • sed -f replace.sed text.txt 的输出:
plaintext 复制代码
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 替换 iswas 删除包含 test 的行
sed(深入) 指定行范围、多行操作、脚本文件 sed '2 s/is/was/' text.txt sed -f replace.sed text.txt 只替换第 2 行的 iswas 按脚本文件替换 iswas
相关推荐
知初~2 小时前
出行项目案例
hive·hadoop·redis·sql·mysql·spark·database
山猪打不过家猪3 小时前
ASP.NET Core Clean Architecture
java·数据库·asp.net
子非衣4 小时前
MySQL修改JSON格式数据示例
android·mysql·json
qwy7152292581634 小时前
13-R数据重塑
服务器·数据库·r语言
Bio Coder4 小时前
R语言安装生物信息数据库包
开发语言·数据库·r语言
钊兵5 小时前
数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)
数据库·mysql·postgresql·oracle·达梦·驱动
weixin_425878236 小时前
Redis复制性能优化利器:深入解析replica-lazy-flush参数
数据库·redis·性能优化
左灯右行的爱情6 小时前
Redis数据结构总结-listPack
数据结构·数据库·redis
隔壁老王1567 小时前
mysql实时同步到es
数据库·mysql·elasticsearch