Linux grep
命令教程
grep
是 Linux 中非常常用的文本搜索工具。它用于在文件中查找符合条件的行,并支持正则表达式匹配。通过掌握 grep
命令,你可以高效地查找文件、分析日志、提取信息等。
1. grep
基本语法
grep [选项] 搜索模式 [文件...]
- 搜索模式:用于匹配的文本或正则表达式。
- 文件:指定要搜索的目标文件。如果省略,则默认从标准输入读取(通常配合管道符
|
使用)。
2. 常用选项
-i
:忽略大小写(case-insensitive)。-v
:反转匹配(显示未匹配的行)。-r
/-R
:递归搜索目录中的所有文件。-n
:显示匹配行的行号。-c
:只显示匹配的行数。-l
:只输出包含匹配内容的文件名。-L
:输出不包含匹配内容的文件名。-o
:只显示匹配的字符串(而不是整行)。-E
:使用扩展正则表达式(相当于egrep
)。-w
:匹配整个单词(而不是部分单词)。-A [数字]
:显示匹配行及其后面几行(after context)。-B [数字]
:显示匹配行及其前面几行(before context)。-C [数字]
:显示匹配行及其前后几行(context)。
3. 基本用法示例
3.1 搜索文件中的文本
查找文件 example.txt
中包含 “error” 的行:
grep "error" example.txt
3.2 忽略大小写搜索
查找 “Warning” 或 “warning” 的行:
grep -i "warning" example.txt
3.3 在多个文件中搜索
查找目录 logs/
中所有文件中包含 “failed” 的行:
grep "failed" logs/*
3.4 显示匹配的行号
查找并显示行号:
grep -n "TODO" main.py
3.5 反向匹配
显示文件中不包含 “success” 的行:
grep -v "success" example.txt
3.6 递归搜索
在当前目录及其子目录中查找包含 “DEBUG” 的行:
grep -r "DEBUG" .
3.7 显示上下文行
显示匹配行及其前两行和后两行:
grep -C 2 "critical error" system.log
3.8 只显示文件名
如果只想知道哪些文件包含 “import” 而不是具体行:
grep -l "import" *.py
3.9 使用正则表达式
查找形如 “root” 开头,后接任意字符,再接一个数字的行:
grep "^root.*[0-9]" passwd.txt
4. 实战场景
4.1 查找日志文件中的错误信息
通常在处理大型日志文件时,你可能只需要查找包含 “ERROR”、“WARNING” 或 “CRITICAL” 的行,可以使用如下命令:
grep -E "ERROR|WARNING|CRITICAL" application.log
4.2 查找 IP 地址
假设你有一个网络日志文件,想要提取其中的所有 IP 地址:
grep -oE "[0-9]{1,3}(\.[0-9]{1,3}){3}" network.log
4.3 统计关键字出现次数
如果你想知道 “failure” 在文件中出现了多少次:
grep -c "failure" example.txt
4.4 查找多种文件中的函数定义
要查找 .c
或 .h
文件中所有以 int
开头的函数定义,可以使用递归搜索并且只输出匹配的行:
grep -r -E "^int .*\(.*\)" --include=\*.{c,h}
4.5 查找不包含特定字符串的文件
要找到当前目录中所有不包含 “DEBUG” 的 .log
文件,可以使用:
grep -rL "DEBUG" --include=\*.log
4.6 使用管道符组合其他命令
grep
与其他命令组合可以发挥更大作用。例如,列出当前目录下大于 1MB 的文件中包含 “TODO” 的行:
find . -type f -size +1M | xargs grep "TODO"
4.7 查找环境变量中的指定值
假设你想在环境变量中查找包含 “PATH” 的行,可以使用:
printenv | grep "PATH"
5. grep
的正则表达式速查表
5.1 基本元字符
字符 | 含义 |
---|---|
. | 匹配任意单个字符(换行符除外) |
^ | 匹配行的开头 |
$ | 匹配行的结尾 |
* | 匹配前一个字符零次或多次 |
+ | 匹配前一个字符一次或多次 |
? | 匹配前一个字符零次或一次 |
` | ` |
[] | 匹配括号内的任意字符 |
() | 分组匹配 |
5.2 常用转义字符
字符 | 含义 |
---|---|
\d | 匹配任意数字 |
\w | 匹配任意字母、数字或下划线 |
\s | 匹配任意空白符(包括空格、制表符等) |
\b | 匹配单词边界 |
\ | 转义符(例如:\. 匹配 “.”) |
6. 高级用法:使用 grep
过滤 git
输出
在开发过程中,你可能希望过滤 git
的输出信息。比如查找当前分支上所有被修改文件中包含 “FIXME” 的行:
git grep "FIXME"
也可以查找过去提交中(commit history)包含 “urgent” 的所有变更:
git log -p | grep "urgent"
7. 提高效率的小技巧
-
使用
--color=auto
:高亮显示匹配的文本,便于快速定位:grep --color=auto "pattern" file.txt
-
结合
tee
保存搜索结果:将输出结果保存到文件中,并在终端中同时显示:grep "pattern" file.txt | tee results.txt