grep · 关键词猎手

上游:find(先找到文件,再用 grep 搜内容)· cat(cat 看内容,grep 过滤内容) 下游:管道(grep 几乎总是和管道一起用)· shell-script(脚本里用 grep 判断条件) 参见:find(find 搜文件名,grep 搜文件内容,两个互补)


一句话是什么

grep 在文件里搜索关键词,只显示包含那个词的行—— 就像在一本书里用荧光笔划出所有提到”我的世界”的句子。


为什么需要它

你有一个配置文件,几百行,想找到 port 设置在哪一行:

# 没有 grep:你要自己从头看
cat ~/mc-server/server.properties
# (几百行滚屏,眼睛找)
 
# 用 grep:直接定位
grep "port" ~/mc-server/server.properties
# server-port=19132
# enable-lan-visibility=true  (这行也含 port 这个词)

真实场景

  • 系统日志几千行,找某个错误信息
  • 配置文件找某个设置项
  • 在一堆代码文件里找某个函数名
  • 把命令输出过滤到你关心的那几行

核心用法

公式

grep [选项] "关键词" 文件

或者接收管道输入:

其他命令 | grep "关键词"

常用命令表

操作命令说明
基础搜索grep "关键词" 文件显示含关键词的行
忽略大小写grep -i "error" 日志.logError/ERROR/error 都匹配
显示行号grep -n "port" 配置.txt知道在第几行
反向搜索grep -v "注释" 文件不含关键词的行
递归搜索目录grep -r "关键词" 目录/搜索目录里的所有文件
只显示文件名grep -l "关键词" *.txt哪些文件含这个词
统计匹配次数grep -c "error" 日志.log这个词出现了几次
显示上下文grep -C 2 "error" 日志.log关键词前后各 2 行

Linux 笑话

Aaron 的 Minecraft 服务器崩溃了,爸爸让他去查日志:

cat ~/mc-server/logs/latest.log

日志狂刷了 800 行,什么也没看出来。

爸爸说:用 grep。

grep -i "error" ~/mc-server/logs/latest.log

立刻出现:

[ERROR] Failed to load level: Permission denied

原来是权限问题——bedrock_server 没有读取游戏存档的权限。

Aaron 用了 15 秒找到了他看了 5 分钟没找到的问题。

grep 不是在帮你读日志,是在帮你跳过所有不重要的行。


例题精讲

📗 初探 Starter — 在配置文件里找设置

任务:在 Minecraft server.properties 里找到端口设置。

# 先看整个配置文件有多长
wc -l ~/mc-server/server.properties
# 假设 35 行
 
# 用 grep 找端口设置
grep "port" ~/mc-server/server.properties
# server-port=19132
# server-portv6=19133
 
# 显示行号(知道在第几行,方便用 nano 编辑)
grep -n "port" ~/mc-server/server.properties
# 14:server-port=19132
# 15:server-portv6=19133

你学到了什么grep 精准定位,-n 显示行号, 下次用 nano 编辑时直接跳到那行。


📘 应用 User — 用管道过滤命令输出

任务apt list --installed 输出几百行,找到跟 python 有关的。

# 原始输出(几百行)
apt list --installed 2>/dev/null | head -5
# Listing...
# adduser/noble,now 3.137ubuntu1 all [installed]
# ...
 
# 用 grep 过滤
apt list --installed 2>/dev/null | grep python
# python3/noble,now 3.12.3-0ubuntu2 amd64 [installed]
# python3-apt/noble,now 2.7.7 amd64 [installed]
# python3-minimal/noble,now 3.12.3-0ubuntu2 amd64 [installed]
 
# 忽略大小写(Python 或 python 都找到)
apt list --installed 2>/dev/null | grep -i python

你学到了什么命令 | grep "关键词" 是过滤输出的标准方法, 不需要把输出先存到文件再搜——管道直接传。


📙 管理 Admin — 搜索系统日志诊断问题

任务:查看今天的系统日志,找到所有错误和警告。

# 方法一:用 journalctl(systemd 日志)
sudo journalctl --since "today" | grep -i "error\|warning\|fail"
 
# 方法二:直接搜日志文件
sudo grep -i "error" /var/log/syslog | tail -20
 
# 统计今天出现了多少个 error
sudo grep -c "error" /var/log/syslog
 
# 找出 error 发生在哪些文件里(递归搜索)
sudo grep -rl "error" /var/log/ 2>/dev/null
 
# 查看 error 的上下文(前后各 3 行,了解是什么引起的)
sudo grep -C 3 "error" /var/log/syslog | head -30

\| 在 grep 里的意思

  • error\|warning = 匹配 “error” 或 “warning”(两个选一个)
  • 这叫正则表达式\| 是”或者”

你学到了什么-C 显示上下文是诊断问题的关键—— 只看错误行有时候不够,需要看前后的情况才能理解原因。


官方文档参考

man grep         # 完整手册
grep --help      # 快速选项列表

grep = Global Regular Expression Print;以行为单位匹配,关键词建议加引号。 在线:https://manpages.ubuntu.com/grep


节点链接

上游(先会这些,grep 才有用武之地)

  • find ← 找到文件后,用 grep 搜文件内容(黄金搭档)
  • cat ← cat 显示内容,grep 过滤内容
  • ls ← ls 的输出可以通过 grep 过滤

同层(总是一起出现)

  • 管道 ← grep 最强用法是接在管道后面

下游(grep 是这些技能的基础)

  • shell-script ← 脚本里用 grep 判断”文件里有没有某个词”
  • find ← find -exec grep 组合,搜整个目录的文件内容

实战


节点版本:v1.0 · 2026-04-20 下一个节点建议:管道find