grep

grepGlobal Regular Expression Print)是 Linux 文本处理三大神器(grepsedawk)中最简单、也是使用频率最高的一个。

它的核心作用只有一句话:

从文本中查找符合条件的内容(按模式匹配过滤行)。

如果说:

  • 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 -vsed '/^#/d;/^$/d'
批量搜索源码 grep -rn
批量处理文件 find + xargs + grep

二十六、grep 思维模型

可以把 grep 理解成一个文本过滤器

文本输入
    │
    ▼
逐行读取
    │
    ▼
模式匹配(字符串或正则)
    │
 ┌──┴──┐
 │     │
匹配   不匹配
 │     │
输出   丢弃

它通常作为 Unix 管道的第一步,把需要的数据筛选出来,再交给 awksedsortuniqxargs 等工具进一步处理。

例如,一个典型的日志分析流水线:

grep "ERROR" app.log \
| awk '{print $5}' \
| sort \
| uniq -c \
| sort -nr

这个组合完成了:

  1. grep:筛选出所有错误日志。
  2. awk:提取第 5 列(如错误类型或模块)。
  3. sort:排序,便于统计。
  4. uniq -c:统计每种错误出现次数。
  5. sort -nr:按出现次数从高到低排序。

这类 grep + awk + sort + uniq 的组合,是 Linux 运维、日志分析和故障排查中最经典、最高频的工作流之一。

posted @ 2026-07-10 16:42  ZovoeY  阅读(24)  评论(0)    收藏  举报