Linux grep与正则表达式示例代码
前言
grep (Global Regular Expression Print) 是 Linux 中最强大的文本搜索工具,配合正则表达式可以实现复杂的文本匹配。
一、基本用法
1. 基础搜索格式
grep [选项] "模式" 文件名
2. 常用选项
| 选项 | 说明 |
|---|---|
-i | 忽略大小写 |
-v | 反向匹配(显示不匹配的行) |
-n | 显示行号 |
-c | 统计匹配行数 |
-l | 只显示包含匹配项的文件名 |
-L | 显示不包含匹配项的文件名 |
-r/-R | 递归搜索目录 |
-w | 全词匹配 |
-A num | 显示匹配行及后面num行 |
-B num | 显示匹配行及前面num行 |
-C num | 显示匹配行及前后各num行 |
二、正则表达式元字符详解
1. 基本匹配
| 模式 | 匹配内容 |
|---|---|
. | 任意单个字符 |
[abc] | a、b或c |
[^abc] | 非a、b、c的字符 |
[a-z] | a到z任意小写字母 |
\w | 单词字符(字母、数字、下划线) |
\W | 非单词字符 |
\s | 空白字符(空格、制表符等) |
\S | 非空白字符 |
\d | 数字([0-9]) |
\D | 非数字 |
2. 数量限定
| 模式 | 匹配次数 |
|---|---|
* | 0次或多次 |
+ | 1次或多次(ERE/PCRE) |
? | 0次或1次 |
{n} | 恰好n次 |
{n,} | 至少n次 |
{n,m} | n到m次 |
3. 位置锚定
| 模式 | 匹配位置 |
|---|---|
^ | 行首 |
$ | 行尾 |
\< | 单词开头 |
\> | 单词结尾 |
\b | 单词边界 |
4. 分组与或
| 模式 | 功能 | |
|---|---|---|
(pattern) | 分组捕获 | |
(?:pattern) | 非捕获分组 | |
| `a | b` | 匹配a或b |
三、实用示例
1. 基础搜索
# 搜索包含"error"的行(区分大小写) grep "error" log.txt # 忽略大小写搜索 grep -i "error" log.txt # 统计"warning"出现次数 grep -c "warning" *.log
2. 复杂正则匹配
# 搜索包含"error"的行(区分大小写) grep "error" log.txt # 忽略大小写搜索 grep -i "error" log.txt # 统计"warning"出现次数 grep -c "warning" *.log
3. 上下文显示
# 显示匹配行及前后2行 grep -C 2 "critical error" system.log # 显示匹配行之后的5行 grep -A 5 "Exception" app.log
4. 递归搜索
# 递归搜索目录中的Python文件 grep -rn "import requests" /project/ # 只显示文件名 grep -rl "TODO" src/
四、性能优化技巧
固定字符串搜索:使用
-F加速纯文本搜索grep -F "fixed-string" largefile.log
1. 默认行为:正则表达式匹配
没有
-F选项时,grep默认使用 正则表达式 来匹配文本。这意味着每个搜索的字符串都需要通过正则表达式引擎进行解析和匹配。正则表达式支持复杂的模式(如字符集、量词、特殊字符等),因此grep需要解析和处理这些表达式来匹配目标文本。这种正则表达式匹配通常比直接查找一个简单的固定字符串要慢,尤其是当正则表达式较复杂时,计算量会大大增加。
2. 使用
-F选项时:固定字符串匹配
grep -F选项告诉grep进行 固定字符串匹配,即不使用正则表达式引擎,而是将搜索模式当作一个普通的固定字符串来处理。在这种模式下,
grep只需要将目标字符串与文本逐字符进行比较。没有正则表达式的复杂处理,因此能够更高效地执行搜索
2.限制搜索深度:结合 find 控制递归深度
find . -maxdepth 3 -type f -exec grep "pattern" {} +
-type f:
-type f选项告诉find只查找普通文件(f代表 "file")。这样可以排除目录、符号链接、设备文件等非普通文件。
-exec:
-exec选项允许你对find查找到的每个文件执行指定的命令。在这里,它表示对找到的每个普通文件执行后续的grep命令。
grep "pattern":
grep "pattern"是一个常见的命令,表示在文件中搜索指定的字符串或模式。这里pattern是你要查找的内容,grep会检查每个文件是否包含该模式。
{}:
{}是find命令中的占位符,它会被当前find命令找到的每个文件路径替代。也就是说,{}会被每个普通文件的路径所替代,从而在每个文件上执行grep "pattern"。
+:
+表示“批量处理”,它告诉find将找到的多个文件一起传递给grep命令,而不是对每个文件单独执行一次grep。这样,grep会一次性处理所有符合条件的文件,性能上比逐个执行grep高效得多。
3.排除目录:
grep -r --exclude-dir={.git,node_modules} "pattern" .六、常见问题解决
#grep 默认使用BRE,需要转义部分元字符
grep "a\{2\}" file.txt # 匹配aa
grep -E "a{2}" file.txt # 不需要转义
#二进制文件警告:
grep -a "text" binary.file # -a 将二进制文件当文本处理
grep --color=auto "pattern" file # 强制颜色显示总结
到此这篇关于Linux grep与正则表达式的文章就介绍到这了,更多相关grep与正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


最新评论