一、Linux 正则表达式详解
- 正则表达式基础
定义:正则表达式(Regex)是一种用于模式匹配的字符序列,支持文本搜索、替换和提取。
核心分类:
基本正则表达式(BRE):需转义特殊字符(如 +、?、|)。
扩展正则表达式(ERE):默认支持扩展语法(通过 grep -E 或 awk 使用)。 - 常用元字符与语法
类别 符号/语法 功能描述 示例 来源
字符匹配 . 匹配任意单个字符(换行符除外) a.c → 匹配 abc、a1c
[abc] 匹配方括号内的任意字符 [0-9] → 匹配数字
[^abc] 匹配不在方括号内的字符 [^0-9] → 匹配非数字
量词 * 匹配前一个字符 0 次或多次(贪婪模式) a.*b → 匹配 a123b
- 匹配前一个字符 1 次或多次 a.+b → 匹配 a1b、a12b
{n,m} 匹配前一个字符至少 n 次,至多 m 次 a{2,4} → 匹配 aa、aaa
位置锚定 ^ 匹配字符串开头 ^error → 匹配以 error 开头的行
$ 匹配字符串结尾 error$ → 匹配以 error 结尾的行
分组 () 分组匹配,支持后向引用 (\d{3})-\1 → 匹配重复的三位数字
零宽断言 (?=exp) 匹配 exp 前面的位置(不消耗字符) \d+(?=%) → 匹配百分号前的数字
- 工具与实战案例
grep:文本搜索
bash
#查找包含 “error” 或 “warning” 的行(扩展正则)
grep -E “error|warning” log.txt
sed:流式文本替换
bash
#将 “2025-03-15” 替换为 “2025/03/15”
sed ‘s/[0−9]{4}[0-9]\{4\}[0−9]{4}-[0−9]{2}[0-9]\{2\}[0−9]{2}-[0−9]{2}[0-9]\{2\}[0−9]{2}/\1/\2/\3/g’ log.txt
awk:结构化数据处理
bash
#统计日志中 HTTP 404 的次数
awk ‘/HTTP 404/ {count++} END {print “404次数:” count}’ access.log - 高级技巧
懒惰匹配:在 、+ 后加 ?(如 a.?b 匹配最短的 a…b)。
后向引用:在 sed 或 vim 中用 \1 引用分组内容:
bash
#交换两个连续单词
echo “hello world” | sed ‘s/.∗.*.∗ .∗.*.∗/\2 \1/’
性能优化:避免贪婪匹配,使用非捕获组 (?:…) 减少回溯。
二、文件格式化处理详解
- 磁盘分区与格式化
查看磁盘信息
bash
fdisk -l # 列出所有磁盘分区
lsblk # 树形显示磁盘和分区
parted -l # 查看 GPT 分区表
分区操作(fdisk)
bash
fdisk /dev/sdb # 进入交互式分区
#命令流程:n(新建)→ p(主分区)→ 设置大小 → w(保存)
格式化文件系统
文件系统 命令 适用场景
ext4 mkfs.ext4 /dev/sdb1 通用 Linux 文件系统
xfs mkfs.xfs /dev/sdb1 大文件和高并发场景
fat32 mkfs.vfat /dev/sdb1 跨平台兼容(如 U 盘)
2. 文件系统优化
调整挂载参数:在 /etc/fstab 中设置 noatime 减少磁盘写入。
磁盘配额:使用 quota 限制用户存储空间。
RAID 配置:通过 mdadm 创建 RAID 0/1/5 提升性能或冗余。
3. 文件内容格式化
文本对齐:使用 column 命令
bash
echo -e “Name\tAge\nAlice\t25\nBob\t30” | column -t -s KaTeX parse error: Undefined control sequence: \t at position 2: '\̲t̲'
JSON/XML 格式化…/.md/’ *.txt
三、正则表达式与文件处理的综合应用
- 日志分析场景
提取 IP 地址
bash
grep -Eo “\b([0-9]{1,3}.){3}[0-9]{1,3}\b” access.log
过滤特定时间段的日志
bash
awk ‘/2025-03-15 10:00:00/,/2025-03-15 12:00:00/’ log.txt - 数据清洗与转换
去除 CSV 中的空格
bash
sed ‘s/[[:space:]]//g’ data.csv
批量替换配置文件中的参数
bash
sed -i ‘s/old_value/new_value/g’ config.ini - 自动化脚本示例
bash
#!/bin/bash
#自动备份并压缩日志
LOG_DIR=“/var/log”
BACKUP_DIR=“/backup/$(date +%Y%m%d)”
mkdir -p $BACKUP_DIR
tar -czvf $BACKUP_DIR/logs.tar.gz $LOG_DIR/*.log
#删除 30 天前的备份
find /backup -mtime +30 -exec rm {} ;
四、注意事项与最佳实践
正则表达式调试
使用在线工具(如 regex101)验证复杂表达式。
在 grep 中添加 -o 仅显示匹配部分,便于调试。
文件操作安全
格式化前确认设备路径(如 /dev/sdb 而非 /dev/sda)。
使用 cp -i 或 mv -i 避免误覆盖文件。
性能考量
避免在循环中频繁调用正则表达式,优先使用 awk 或 perl 单次处理。
大文件处理时结合 split 分割文件。