当前位置: 首页 > article >正文

Linux shell 正则表达式高效使用

Linux正则表达式高效使用教程

正则表达式是Linux命令行中强大的文本处理工具,能够极大提高搜索和匹配效率。下面为新手提供一个简单教程,介绍如何在grepfind命令中使用正则表达式。
使用建议:使用grep时要加-E选项使其支持扩展正则表达式,配合findxargs得到更精确的匹配结果。

一、正则表达式基础

1. 基本元字符
  • .:匹配任意单个字符(换行符除外)
  • *:匹配前面的字符0次或多次
  • +:匹配前面的字符1次或多次(扩展正则表达式)
  • ?:匹配前面的字符0次或1次(扩展正则表达式)
  • ^:匹配行首
  • $:匹配行尾
  • []:匹配方括号内的任意一个字符
  • [^]:匹配不在方括号内的任意一个字符
  • |:逻辑或,匹配两个模式之一(扩展正则表达式)
2. 字符类简写
  • [0-9]:匹配任意数字,等价于\d(PCRE模式)
  • [a-zA-Z]:匹配任意字母
  • [[:space:]]:匹配任意空白字符(空格、制表符等)
  • [[:alpha:]]:匹配任意字母
  • [[:digit:]]:匹配任意数字

二、在grep中使用正则表达式

1. 基本用法
grep '模式' 文件名
2. 常用选项
  • -E:启用扩展正则表达式(支持+?|等)
  • -i:忽略大小写
  • -r:递归搜索目录
  • -n:显示匹配行的行号
  • -v:取反匹配(显示不匹配的行)
  • -o:只输出匹配的部分
3. 示例
  • 查找包含数字的行

    grep '[0-9]' file.txt
    
  • 查找以#开头的注释行

    grep '^#' config.ini
    
  • 查找包含"apple"或"banana"的行(扩展正则)

    grep -E 'apple|banana' fruits.txt
    
  • 查找以字母开头,后跟一个或多个数字的行

    grep -E '^[a-zA-Z][0-9]+' data.txt
    
  • 查找 main 函数所在位置

    grep -rE 'main\(\)' ./    # 加-E的结果远比不加-E的结果精确
    

三、在find中使用正则表达式

1. 基本用法
find 路径 -regex '正则表达式'  # 匹配完整路径
find 路径 -iregex '正则表达式' # 忽略大小写
2. 常用选项
  • -name:按文件名匹配(支持通配符,非正则)
  • -regex:按完整路径匹配(使用正则)
  • -iregex:按完整路径匹配(忽略大小写)
  • -type f:只匹配文件
  • -type d:只匹配目录
  • -mtime -n:匹配n天内修改的文件
3. 示例
  • 查找所有 .txt 或 .md 文件

    find . -regex '.*\.\(txt\|md\)'
    
  • 查找所有以数字开头的文件

    find . -regex '.*/[0-9].*'
    
  • 查找src目录下的C或C++源文件

    find src -iregex '.*\.\(c\|cpp\|h\|hpp\)'
    

四、进阶技巧

因为很多命令无法接收管道输出结果只能接受stdin输入命令,xargs的作用是把管道输出转为stdin输入,这样find就可以和grep结合啦。(让grep只在find得到的文件中查找)
xargs命令教程,太好用啦

1. 结合xargs提高效率

find的结果传递给其他命令:

find ./ -name *.c | xargs grep -nE ' main\('
find . -name '*.txt' -print0 | xargs -0 grep 'pattern'
  • -print0:使用null分隔结果,避免空格问题
  • -0:告诉xargs使用null作为分隔符
2. 使用正则表达式重命名文件

结合rename命令:

# 将所有.jpg文件重命名为.jpeg
rename 's/\.jpg$/.jpeg/' *.jpg
3. 在管道中使用正则
ps aux | grep -E '[f]irefox|chrome'  # 查找Firefox或Chrome进程
  • [f]技巧:避免grep自身出现在结果中

五、练习与巩固

1. 练习题
  • 查找所有包含邮箱地址的行(正则:[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
  • 查找所有以"error"或"warning"开头的日志行
  • 查找所有包含连续3个数字的文件
2. 参考资源
  • man grepman find 查看官方文档
  • 在线正则测试工具:https://regex101.com/
  • 正则表达式速查表:https://www.debuggex.com/cheatsheet/regex/pcre

六、注意事项

  1. 基本 vs 扩展正则grep默认使用基本正则,需用-E启用扩展
  2. 转义问题:在基本正则中,()|等特殊字符需要转义(如\|
  3. 性能考虑:复杂正则可能影响效率,尽量简化模式
  4. 测试优先:在处理重要文件前,先用小样本测试正则表达式

掌握这些技巧后,你将能够快速定位文件、筛选文本,大幅提高命令行工作效率!

http://www.lryc.cn/news/2384252.html

相关文章:

  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Blurry Loading (毛玻璃加载)
  • C#中的ThreadStart委托
  • GPU加速Kubernetes集群助力音视频转码与AI工作负载扩展
  • LeetCode[222]完全二叉树的节点个数
  • DPDK 技术详解:榨干网络性能的“瑞士军刀”
  • anaconda的c++环境与ros2需要的系统变量c++环境冲突
  • Docker 疑难杂症解决指南大纲
  • 深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务
  • Python 实现web请求与响应
  • 演示:【WPF-WinCC3D】 3D工业组态监控平台源代码
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.4 数据库与表的基本操作(DDL/DML语句)
  • CUDA加速的线性代数求解器库cuSOLVER
  • Oracle 物理存储与逻辑管理
  • vscode优化使用体验篇(快捷键)
  • 如何在电脑上登录多个抖音账号?多开不同IP技巧分解
  • 【东枫科技】usrp rfnoc 开发环境搭建
  • 【JAVA资料,C#资料,人工智能资料,Python资料】全网最全编程学习文档合集,从入门到全栈,保姆级整理!
  • [IMX] 05.串口 - UART
  • 使用Tkinter写一个发送kafka消息的工具
  • MongoDB 与 EF Core 深度整合实战:打造结构清晰的 Web API 应用
  • JAVA|后端编码规范
  • 重写B站(网页、后端、小程序)
  • 文档债务拖累交付速度?5大优化策略文档自动化
  • 【数据结构与算法】LeetCode 每日三题
  • 基于深度学习的电力负荷预测研究
  • 篇章十 消息持久化(二)
  • 【IDEA】删除/替换文件中所有包含某个字符串的行
  • 基于深度学习的不良驾驶行为为识别检测
  • FD+Mysql的Insert时的字段赋值乱码问题
  • 第十周作业