Bash 中如何使用正则表达式进行文本处理?(中等)

👨‍⚕️ 主页: gis分享者

👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍⚕️ 收录于专栏:Shell 面试

文章目录

  • 一、🍀前言
    • [1.1 ☘️示例](#1.1 ☘️示例)
    • [1.2 ☘️知识扩展](#1.2 ☘️知识扩展)
    • [1.3 ☘️实践指南](#1.3 ☘️实践指南)

一、🍀前言

在 Bash 脚本中,可以使用正则表达式来进行文本处理,最常用的工具是 grep、sed 和 awk。

1.1 ☘️示例

举个简单的例子,假设你有一个文本文件 example.txt,你想查找包含特定模式的行。

你可以使用 grep:

powershell 复制代码
grep 'pattern' example.txt

如果你想对文本进行替换,可以用 sed:

powershell 复制代码
sed 's/old_pattern/new_pattern/g' example.txt

对于更复杂的文本处理,例如统计、格式化,你可以用 awk:

powershell 复制代码
awk '/pattern/ {print $0}' example.txt

1.2 ☘️知识扩展

1)grep:

grep 是最基础的文本搜索工具,它支持基本和扩展的正则表达式。

例子:

查找包含数字的行: grep '[0-9]' example.txt

忽略大小写查找:grep -i 'pattern' example.txt

查找并显示行号:grep -n 'pattern' example.txt

递归查找:grep -r 'pattern' /path/to/directory

2)sed:

sed 是一个流编辑器,用于对文本进行筛选和替换。

例子:

替换文件中第一次出现的匹配:sed 's/pattern/replacement/' example.txt

替换整个文件中的所有匹配:sed 's/pattern/replacement/g' example.txt

删除包含特定模式的行:sed '/pattern/d' example.txt

在特定模式后添加文本:sed '/pattern/a\new text' example.txt

3)awk:

awk 是一个强大的文本处理工具,适用于格式化报告和统计分析。

例子:

查找并打印匹配的行:awk '/pattern/ {print $0}' example.txt

分隔特定字段并打印:awk -F: '{print $1}' example.txt(假设文件以冒号分隔)

统计出现次数:awk '/pattern/ {count++} END {print count}' example.txt

进阶内容

1)复杂模式匹配

使用扩展正则表达式:通过添加 -E 参数,你可以让 grep 使用扩展正则:grep -E 'pattern1|pattern2' example.txt。

同理,你也可以在 sed 中使用扩展正则:sed -E 's/old_pattern(new_pattern)/replacement/g' example.txt

2)结合工具使用

你可以将这几个工具组合使用,以实现更复杂的文本处理任务。例如,先用 grep 筛选,再用 awk 处理:

powershell 复制代码
grep 'pattern' example.txt | awk '{print $1}'

1.3 ☘️实践指南

一、核心处理方式

  1. 原生Bash正则匹配
powershell 复制代码
if [[ "string" =~ ^regex_pattern$ ]]; then
    echo "匹配成功"
    echo "捕获组:${BASH_REMATCH[1]}"
fi
  1. 高级参数扩展
powershell 复制代码
var="2024-07-25_log.txt"
echo ${var//[^0-9]/}       # 删除非数字字符 → 20240725
echo ${var/#*_/}           # 去除前缀保留文件名 → log.txt

二、常用工具链

工具 能力范围 典型用例
grep 模式搜索过滤 `grep -E 'error
sed 流式编辑替换 sed -E 's/(\d{4})-(\d{2})/\2/\1/g'
awk 结构化字段处理 awk '/GET/ && 9==200 {print 7}' log
perl PCRE高级正则 perl -pe 's/\b\d+\b/NUM/g'

三、正则表达式类型

powershell 复制代码
# 基础正则(BRE)
grep '^From: .*@ctc.com$' emails.txt

# 扩展正则(ERE)
grep -E '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z]{2,4}' contacts.txt

# Perl兼容正则(PCRE)
grep -P '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z' timestamps.log

四、实战案例

  1. 日志分析
powershell 复制代码
# 提取HTTP状态码非200的请求
tail -f access.log | awk 'match($0, /HTTP\/1\.1" ([0-9]{3})/, arr) && arr[1] != 200'
  1. 数据清洗
powershell 复制代码
# 标准化电话号码格式
sed -E 's/(\+86)?[ ]*([0-9]{3})-?([0-9]{4})-?([0-9]{4})/\1 \2-\3-\4/' contacts.csv
  1. 安全检测
powershell 复制代码
# 检测SQL注入特征
grep -P '(union\s+select|sleep\(\d+\)|benchmark\(|\b(and|or)\b.+=[^'"'"']*["'"'"]\s*["'"'"])' web_logs

五、性能优化建议

  1. 优先使用原生Bash操作避免子进程开销
  2. 复杂匹配使用预编译正则(如awk/perl)
  3. 大文件处理时结合LC_ALL=C提升ASCII处理速度
  4. 避免贪婪匹配.*改用精准限定符

六、调试技巧

powershell 复制代码
# 可视化匹配过程
grep --color=auto -nE 'pattern' file

# 测试正则表达式
pcre2test  # 专用测试工具
相关推荐
想唱rap1 天前
表的约束条件
linux·数据库·mysql·ubuntu·bash
噎住佩奇1 天前
正则表达式(Regex)入门
运维·正则表达式
倔强的石头1061 天前
【Linux指南】进程控制系列(四)进程替换 ——exec 系列函数全解析与应用
linux·运维·bash
Irene19912 天前
JavaScript 正则表达式 API 总结
正则表达式
linuxxx1102 天前
正则匹配应用小案例
数据库·正则表达式
威风的虫2 天前
常用的正则表达式
正则表达式
tianyuanwo3 天前
Bash与Sh的诞生背景、底层原理及Linux多Shell解释器兼容性解析
linux·开发语言·bash
Lv11770083 天前
Visual Studio中的正则表达式
ide·笔记·正则表达式·c#·visual studio
故事不长丨3 天前
C#正则表达式完全攻略:从基础到实战的全场景应用指南
开发语言·正则表达式·c#·regex
YxVoyager4 天前
Qt C++ :QRegularExpression 正则表达式使用详解
c++·qt·正则表达式