Linux shell 正则表达式高效使用
Linux正则表达式高效使用教程
正则表达式是Linux命令行中强大的文本处理工具,能够极大提高搜索和匹配效率。下面为新手提供一个简单教程,介绍如何在grep
和find
命令中使用正则表达式。
使用建议:使用grep
时要加-E
选项使其支持扩展正则表达式,配合find
和xargs
得到更精确的匹配结果。
一、正则表达式基础
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 grep
和man find
查看官方文档- 在线正则测试工具:https://regex101.com/
- 正则表达式速查表:https://www.debuggex.com/cheatsheet/regex/pcre
六、注意事项
- 基本 vs 扩展正则:
grep
默认使用基本正则,需用-E
启用扩展 - 转义问题:在基本正则中,
()
、|
等特殊字符需要转义(如\|
) - 性能考虑:复杂正则可能影响效率,尽量简化模式
- 测试优先:在处理重要文件前,先用小样本测试正则表达式
掌握这些技巧后,你将能够快速定位文件、筛选文本,大幅提高命令行工作效率!