grep
grep(Global Regular Expression Print)是 Linux 文本处理三大神器(grep、sed、awk)中最简单、也是使用频率最高的一个。
它的核心作用只有一句话:
从文本中查找符合条件的内容(按模式匹配过滤行)。
如果说:
- grep:负责查找
- sed:负责修改
- awk:负责分析、统计、计算
那么 grep 是整个 Linux 文本处理链路的入口。
一、grep 工作原理
假设:
hello
linux
world
hello chatgpt
执行:
grep hello file.txt
输出:
hello
hello chatgpt
grep 的工作流程可以理解为:
读取一行
│
▼
是否匹配?
│
┌────┴────┐
│ │
是 否
│ │
输出 丢弃
二、最常见:查找字符串
例如:
grep "error" app.log
输出所有包含:
error
的行。
多个文件:
grep "ERROR" *.log
输出:
app.log:ERROR timeout
db.log:ERROR connect
三、忽略大小写(-i)
例如:
日志:
ERROR
Error
error
普通:
grep error
只能匹配:
error
使用:
grep -i error
输出:
ERROR
Error
error
四、显示行号(-n)
例如:
grep -n ERROR app.log
输出:
15:ERROR timeout
88:ERROR mysql
非常适合定位问题。
五、统计匹配数量(-c)
例如:
grep -c ERROR app.log
输出:
35
表示:
共有35行 ERROR。
六、只显示文件名(-l)
例如:
grep -l ERROR *.log
输出:
app.log
mysql.log
只告诉:
哪些文件包含 ERROR。
反过来:
grep -L ERROR *.log
输出:
没有 ERROR 的文件。
七、反向匹配(-v)
这是生产最常用之一。
例如:
配置:
#
#
listen 80
#
worker
删除注释:
grep -v '^#'
输出:
listen 80
worker
删除空行:
grep -v '^$'
一起:
grep -v '^#' |
grep -v '^$'
或者:
grep -Ev '^#|^$'
八、递归搜索(-r)
整个目录:
grep -r "password" .
例如:
./config.yaml
./app.conf
都会搜索。
只搜索:
grep -rn "TODO" src/
输出:
main.go:55:TODO
参数:
-r:递归-n:行号
九、正则表达式
开头
grep '^root'
匹配:
root
root123
结尾
grep '\.log$'
匹配:
app.log
整行
例如:
abc
abcd
只匹配:
abc
使用:
grep '^abc$'
数字
grep '[0-9]'
IP
grep '[0-9]\+\.[0-9]'
十、扩展正则(-E)
例如:
匹配 jpg 或 png:
grep -E 'jpg|png'
等价:
egrep 'jpg|png'
现代系统推荐:
grep -E
十一、显示前后内容
日志排查神器。
前3行
grep -B 3 ERROR app.log
后5行
grep -A 5 ERROR app.log
前后3行
grep -C 3 ERROR app.log
输出:
INFO
INFO
ERROR
stack
stack
十二、匹配整个单词(-w)
例如:
日志:
cat
catch
category
普通:
grep cat
全部匹配。
只匹配:
cat
使用:
grep -w cat
十三、匹配次数(-o)
例如:
aaa aaa aaa
普通:
grep aaa
输出整行。
使用:
grep -o aaa
输出:
aaa
aaa
aaa
统计:
grep -o aaa file |
wc -l
十四、grep + find
生产经典。
例如:
所有 Java:
find . -name "*.java" |
xargs grep TODO
更安全:
find . -name "*.java" -print0 |
xargs -0 grep TODO
其实 grep 自己也能:
grep -rn TODO .
十五、grep + awk
例如:
找 nginx:
ps -ef |
grep nginx |
awk '{print $2}'
得到 PID。
更推荐:
ps -ef |
awk '/nginx/{print $2}'
少一个 grep。
十六、grep + sed
例如:
日志:
grep ERROR app.log |
sed 's/ERROR/[ERROR]/'
十七、grep + xargs
例如:
删除:
find . -name "*.log" |
grep access |
xargs rm
Docker:
docker ps |
grep nginx |
awk '{print $1}' |
xargs docker stop
十八、日志分析(生产)
例如:
查看 ERROR:
grep ERROR app.log
多个关键词:
grep -E "ERROR|WARN"
排除 DEBUG:
grep -v DEBUG
今天日志:
grep "2025-01-01"
十九、系统运维
查看端口
ss -tunlp |
grep 8080
查看 Java
ps -ef |
grep java
避免 grep 自己:
ps -ef |
grep "[j]ava"
或者更推荐:
pgrep java
查看内存:
free -m |
grep Mem
查看磁盘:
df -h |
grep "/data"
二十、代码搜索
例如:
搜索:
grep -rn TODO src/
查函数:
grep -rn "func Login"
查 SQL:
grep -rn "SELECT"
查密码:
grep -rn password .
二十一、配置文件分析
例如:
nginx:
删除注释:
grep -v '^#'
删除空行:
grep -v '^$'
一起:
grep -Ev '^#|^$'
hosts:
grep localhost /etc/hosts
二十二、二进制文件
默认:
grep 遇到二进制:
Binary file matches
强制:
grep -a keyword file
把它当文本。
二十三、常用参数速查
| 参数 | 作用 | 示例 | |
|---|---|---|---|
-i |
忽略大小写 | grep -i error |
|
-n |
显示行号 | grep -n ERROR |
|
-c |
统计数量 | grep -c ERROR |
|
-v |
反向匹配 | grep -v '^#' |
|
-r |
递归目录 | grep -r TODO src |
|
-l |
只显示文件名 | grep -l ERROR *.log |
|
-L |
显示不匹配文件 | grep -L ERROR *.log |
|
-w |
整个单词 | grep -w cat |
|
-o |
只输出匹配内容 | grep -o ERROR |
|
-A |
后几行 | grep -A3 ERROR |
|
-B |
前几行 | grep -B3 ERROR |
|
-C |
前后几行 | grep -C3 ERROR |
|
-E |
扩展正则 | `grep -E 'a | b'` |
-F |
固定字符串(不使用正则) | grep -F 'a.b' |
补充:
-F是一个非常值得掌握的高频选项。
当搜索内容是普通字符串(不是正则)时,grep -F会把模式当作字面量处理,速度通常更快,也避免了.、*、[]等正则字符被误解释。
例如:
grep -F '192.168.1.1' access.log
无需写成:
grep '192\.168\.1\.1' access.log
二十四、生产环境黄金模板
查看 ERROR
grep -rn "ERROR" /var/log
查看最近异常
grep -C3 ERROR app.log
删除注释
grep -Ev '^#|^$'
查 TODO
grep -rn TODO .
查 IP
grep '192\.168'
统计访问次数
grep -c "GET /login" access.log
查多个关键字
grep -E "ERROR|WARN|FATAL"
二十五、grep、sed、awk 如何分工?
| 需求 | 推荐工具 |
|---|---|
| 查找包含某个关键字 | grep |
| 按列提取 PID、IP、用户名 | awk |
| 批量替换配置 | sed |
| 统计日志状态码 | awk |
| 删除注释、空行 | grep -v 或 sed '/^#/d;/^$/d' |
| 批量搜索源码 | grep -rn |
| 批量处理文件 | find + xargs + grep |
二十六、grep 思维模型
可以把 grep 理解成一个文本过滤器:
文本输入
│
▼
逐行读取
│
▼
模式匹配(字符串或正则)
│
┌──┴──┐
│ │
匹配 不匹配
│ │
输出 丢弃
它通常作为 Unix 管道的第一步,把需要的数据筛选出来,再交给 awk、sed、sort、uniq、xargs 等工具进一步处理。
例如,一个典型的日志分析流水线:
grep "ERROR" app.log \
| awk '{print $5}' \
| sort \
| uniq -c \
| sort -nr
这个组合完成了:
grep:筛选出所有错误日志。awk:提取第 5 列(如错误类型或模块)。sort:排序,便于统计。uniq -c:统计每种错误出现次数。sort -nr:按出现次数从高到低排序。
这类 grep + awk + sort + uniq 的组合,是 Linux 运维、日志分析和故障排查中最经典、最高频的工作流之一。

浙公网安备 33010602011771号