锦方的个人网页 · 如果有一天你突然想起了我


grep 命令

目录

grep 是 Linux / macOS 终端里最常用的文本搜索命令,用来在文件中查找包含指定内容的行。平时查日志、搜配置、看源码、筛命令输出,几乎都会用到它。

注:用到了这个命令想写一长段,写了一小段写了几天都写不动,后交由 gpt5.4 扩写,未经人工校对,可能存在错误,仅供参考。

基本语法

grep [选项] "模式" 文件名

例如:

grep "123" 333.txt

含义:查找 333.txt 中所有包含 123 的行。

如果要从命令输出里继续筛选,也可以这样写:

ps aux | grep nginx

含义:先列出进程,再从结果里找出包含 nginx 的行。

常用参数速查

grep -i "123" 333.txt

忽略大小写(abcABC 都能匹配)。

grep -n "123" 333.txt

显示行号,便于定位。

grep -c "123" 333.txt

只统计匹配行数,不显示具体内容。

grep -v "123" 333.txt

反向匹配:显示不包含 123 的行。

grep -l "123" *.txt

只列出“包含匹配内容”的文件名。

grep -L "123" *.txt

只列出“不包含匹配内容”的文件名。

grep -o "123" 333.txt

只输出匹配到的部分,不输出整行。

grep -w "cat" words.txt

按“完整单词”匹配,比如会匹配 cat,但不会匹配 category

grep -x "hello" words.txt

整行完全匹配,只有这一行内容刚好等于 hello 才算命中。

递归搜索目录

grep -r "123" ./mydir

mydir 目录及其子目录中递归查找。

-r-R 都用于递归搜索:

经常会和 -n 一起使用:

grep -rn "database" ./project

这样可以同时看到文件路径、行号和匹配内容。

只查指定类型的文件

项目里文件很多时,直接递归搜索往往会把无关内容也带出来,这时可以限制文件范围。

grep -rn "main" . --include="*.rs"

只在 .rs 文件中查找。

grep -rn "debug" . --exclude="*.log"

排除 .log 文件。

grep -rn "TODO" . --exclude-dir="node_modules"

排除某个目录。

这几个参数在大项目里很实用,不然结果会很杂。

显示匹配行前后的上下文

排查日志或读代码时,只看一行通常不够,这时可以带上前后文。

grep -nA 3 "Exception" app.log

显示匹配行以及后面 3 行。

grep -nB 2 "Exception" app.log

显示匹配行以及前面 2 行。

grep -nC 2 "Exception" app.log

显示匹配行前后各 2 行。

其中:

grep 与正则表达式

grep 最强的地方之一,就是可以配合正则表达式使用。

基础示例

grep "^root" /etc/passwd

查找以 root 开头的行。

grep "sh$" /etc/passwd

查找以 sh 结尾的行。

grep "[0-9]" data.txt

查找包含数字的行。

grep "\.jpg$" filelist.txt

查找以 .jpg 结尾的文件名。这里的 . 需要转义,因为在正则里点号有特殊含义。

扩展正则

如果想用更方便的正则语法,可以加 -E

grep -E "foo|bar" test.txt

匹配 foobar

grep -E "[0-9]{3}" test.txt

匹配连续 3 位数字。

常见写法:

实战示例

  1. 在项目中查找包含 TODO 的代码行:
grep -rn "TODO" .
  1. 查找日志中的 error(忽略大小写):
grep -i "error" app.log
  1. 统计 Nginx 日志中 404 出现的行数:
grep -c " 404 " access.log
  1. 只看配置文件里“非注释行”:
grep -v "^#" nginx.conf
  1. 过滤空行和注释行:
grep -Ev "^#|^$" nginx.conf
  1. 在 Markdown 文件里找二级标题:
grep "^## " notes.md
  1. 只提取日志里的 IP 地址片段(简单匹配示例):
grep -Eo "[0-9]{1,3}(\.[0-9]{1,3}){3}" access.log

这里用了:

和管道一起使用

grep 很常见的一种用法,不是直接查文件,而是接在别的命令后面做筛选。

history | grep git

从历史命令中找出包含 git 的记录。

ls -la | grep "\.md$"

ls 输出里找出 Markdown 文件。

cat app.log | grep ERROR

这个写法可以用,但如果是直接查文件,通常更推荐:

grep ERROR app.log

少一个管道,写法也更直接。

搜进程时的一个小坑

很多人会这样查进程:

ps aux | grep nginx

问题是它通常也会把 grep nginx 这一行自己匹配出来。

常见写法:

ps aux | grep "[n]ginx"

这样既能匹配 nginx 进程,又不会把当前这条 grep 命令本身匹配进去。

返回值

grep 不只是看输出,还常被放进脚本里判断条件。

例如:

grep -q "ready" app.log
echo $?

其中 -q 表示安静模式,不输出内容,只看是否匹配成功。

脚本里经常这样写:

if grep -q "ready" app.log; then
  echo "service is ready"
fi

常见组合

grep -rin "keyword" ./src

这是日常开发里非常高频的一组参数。

小提示

示例:

grep -rn "main" . --include="*.rs" --exclude-dir="target"

总结

grep 的核心就是:在文本中按“模式”筛选行。先记住 -i -n -v -c -r 这些最常用参数,再补上 -E-o-A/-B/-C 这些进阶选项,日常查日志、找配置、搜源码基本就够用了。

如果只是普通文本搜索,先从最简单的命令开始;如果搜索条件变复杂,再逐步加上正则和过滤参数。这样最不容易写乱。

系列:note

该系列自动来自分类: note

  1. 备份dokuwiki数据
  2. grep 命令 (当前)
  3. zola的Front Matter完整字段的意思
  4. 从dokuwiki切换到quartz
  5. 安装immich记录
  6. 修改dokuwiki时区
  7. macos安装dokuwiki
  8. Debian创建新用户和设置防火墙
  9. mac在Debian安装wireguard和使用
  10. 再也不买不能解bl的手机了
  11. Firefox设置
  12. debian安装FFmpeg来合并youtube音频
  13. css 扩散列表
  14. 两个练习
  15. css RWD
  16. css 图片
  17. css 提示
  18. css 下拉
  19. css 表单
  20. css 导航栏
  21. css 单词
  22. HTML SVG
  23. HTML Canvas
  24. HTML input
  25. HTML 结构
  26. 电气施工图说明
  27. china uses dropbox
  28. Nginx installs SSL certificates
  29. debian install shadowsocks
  30. Visual studio code set the python environment
  31. install hexo

下一篇推荐

系列继续阅读

zola的Front Matter完整字段的意思