一、正则表达式基础
1. 核心概念
正则表达式是一种用于描述字符串模式的规则语言,通过组合普通字符和元字符来定义”模板”,用于文本的模式匹配、查找和替换操作。
2. 元字符分类
| 元字符 | 功能说明 | 示例 |
|---|---|---|
. | 匹配任意单个字符(除换行符) | a.b匹配 “axb”、”a1b” |
* | 匹配前一个字符0次或多次 | go*d匹配 “gd”、”good” |
+ | 匹配前一个字符1次或多次 | go+d匹配 “god”、”good” |
? | 匹配前一个字符0次或1次 | go?d匹配 “gd”、”god” |
{n} | 匹配前一个字符恰好n次 | a{3}匹配 “aaa” |
{n,m} | 匹配前一个字符n到m次 | a{2,3}匹配 “aa”、”aaa” |
^ | 匹配行首 | ^root匹配以root开头的行 |
$ | 匹配行尾 | bash$匹配以bash结尾的行 |
[] | 字符集合 | [abc]匹配a、b、c任意一个 |
[^] | 排除字符集合 | [^0-9]匹配非数字字符 |
| ` | ` | 逻辑或 |
() | 分组捕获 | (ab)+匹配多个连续的ab |
3. BRE与ERE的区别
基础正则表达式(BRE):默认由grep使用,部分元字符需转义(如+需写为\+) 扩展正则表达式(ERE):通过grep -E或egrep启用,元字符无需转义,功能更丰富
二、文本处理三剑客
1. grep – 文本搜索工具
基本语法:grep [选项] "模式" 文件名常用选项:
-i:忽略大小写-v:反向匹配(排除指定内容)-n:显示行号-c:统计匹配行数-o:仅输出匹配内容-E:启用扩展正则表达式-A n:显示匹配行及后n行-B n:显示匹配行及前n行-C n:显示匹配行前后各n行
示例:
# 查找包含root的行并显示行号
grep -n "root" /etc/passwd
# 统计错误日志中的错误数量
grep -c "error" log.txt
# 忽略大小写查找
grep -i "ERROR" log.txt
2. sed – 流编辑器
基本语法:sed [选项] '编辑命令' 文件名常用选项:
-n:禁止默认输出-i:直接修改文件(慎用)-e:执行多个编辑命令-r:支持扩展正则表达式
核心操作符:
s:替换文本(最常用)d:删除行p:打印行a:行后追加i:行前插入c:整行替换
示例:
# 全局替换old为new
sed 's/old/new/g' file.txt
# 删除空行
sed '/^$/d' file.txt
# 打印第2-5行
sed -n '2,5p' file.txt
# 直接修改文件(备份原文件)
sed -i.bak 's/old/new/g' file.txt
3. awk – 文本分析工具
基本语法:awk '条件 {动作}' 文件名内置变量:
$0:整行内容$1,$2...:第1、2…列字段NF:当前行的字段数NR:当前行号FS:输入字段分隔符(默认空格)OFS:输出字段分隔符
常用选项:
-F:指定字段分隔符-v:向awk脚本传递变量
示例:
# 以冒号分隔,打印第1和第3列
awk -F: '{print $1,$3}' /etc/passwd
# 打印第3列大于1000的行
awk -F: '$3>1000 {print $1}' /etc/passwd
# 统计行数
awk 'END {print NR}' file.txt
# 按列求和
awk '{sum += $1} END {print sum}' file.txt
三、实战案例
案例1:提取网卡IP地址
方法1:grep + awk
ifconfig eth0 | grep "inet addr" | awk -F '[ :]+' '{print $4}'
方法2:awk按行处理
ifconfig eth0 | awk -F '[ :]+' 'NR==2 {print $4}'
方法3:sed多步替换
ifconfig eth0 | sed -n '2p' | sed 's#^.*addr:##g' | sed 's#Bcast.*$##g'
方法4:sed分组提取
ifconfig eth0 | sed -n 's#^.*addr:\(.*\) Bcast.*$#\1#gp'
案例2:提取目录权限数字
方法1:sed + cut
stat /etc | sed -n '4p' | cut -d "(" -f2 | cut -d "/" -f1
方法2:cut按字符截取
stat /etc | sed -n '4p' | cut -d "(" -f2 | cut -c 2-4
方法3:awk多分隔符
stat /etc | awk -F '[(/]' 'NR==4 {print $2}'
方法4:stat直接输出
stat -c %a /etc # 直接获取数字权限
四、学习建议
- 从简单开始:先掌握基础元字符和单个工具的基本用法
- 多实践:通过实际案例加深理解,尝试用不同方法解决同一问题
- 查阅文档:使用
man grep、man sed、man awk查看详细参数说明 - 组合使用:学会将三个工具通过管道
|组合使用,发挥最大威力 - 注意转义:在BRE模式下注意特殊字符的转义问题