grep&curl命令学习笔记

一.grep常用命令解析

1.grep常用命令

grep 是 Linux/Unix 系统中最核心、最强大的文本搜索工具,它就像你手里的"超级筛子"------能从海量数据中精准筛出你想要的每一行信息。

css 复制代码
bash
grep [选项] "搜索模式" [目标文件]
选项 含义 示例
-i 忽略大小写 grep -i "error" logs.txt
-v 反向匹配(显示不包含该模式的行) grep -v "debug" logs.txt
-n 显示匹配行的行号 grep -n "404" access.log
-c 只输出匹配的行数(不显示内容) grep -c "success" data.txt
-l 只输出包含匹配内容的文件名 grep -l "TODO" *.py
-r / -R 递归搜索子目录 grep -r "main" ./src/
-E 启用扩展正则表达式(支持 ` +?{}`) `grep -E "error fatal" app.log`
-A n 显示匹配行及其后 n 行(After) grep -A 5 "Exception" app.log
-B n 显示匹配行及其前 n 行(Before) grep -B 5 "Exception" app.log
-C n 显示匹配行及其前后各 n 行(Context) grep -C 3 "NullPointer" app.log

logs.txt

vbnet 复制代码
Error xxxxx
error mmmmmccccError dd
error123
abcdeoosoos
mmmmmmmmerror
cccccccaaaErrosError
dddddddddFFFFFF:aaaaaaaaaaaaaaaa
2026-06-25 00:00:00.545 [grpc-default-executor-92]
WARN  c.z.a.e.a.grpc.service.impl.AutorsGrpcServiceImpl 243 - LOCALIZATION message, localize: true
2026-06-25 00:00:01.545 [grpc-default-executor-91]
WARN  c.z.a.e.a.grpc.service.impl.AutorsGrpcServiceImpl 243 - LOCALIZATION message, localize: true
2026-06-25 00:00:02.309 [threadPoolTaskScheduler8]
WARN  com.zhkj.allyrobot.util.network.HostWifiUtil 195 -
Host WiFi: [{"authMode":"WPA2","channel":"149","connectedStatus":1,"htExtcha":0,"index":0,
"intensity":69,"mac":"EC:B9:70:65:78:84","wifiName":"ZHKJ","wifiPassword":"ZHKJ20150801"},

error.txt

vbnet 复制代码
ERROR
error
INFO
info
WARN
warn
  • grep -i "error" logs.txt 忽略大小写
  • grep "error" logs.txt 精确匹配(包含)
  • grep -v 'error' logs.txt 反向匹配
  • grep -n 'WARN' logs.txt 显示匹配行的行号

  • grep -c 'WARN' logs.txt 显示匹配的行数

  • grep -l 'error' *.txt
  • grep -r 'rag' ./app/ 递归搜索子目录下含有rag的每条信息
  • grep -E 'error|warn' error.txt 启用扩展正则表达式 (支持 |+?{}
  • grep - A 2 'ERROR' error.txt 显示匹配行以及前2行
  • grep - B 2 'INFO' error.txt 显示匹配行以及后2行
  • grep - C 2 'INFO' error.txt 显示匹配行以及前后2行
  • 示例1
bash 复制代码
grep "Parameters of creating a task\|Parameters of issuing a task\|Receive task action type" \
     /tmp/info.log
  • \ 是 Shell 中的续行符 ,而不是换行符本身,他的作用是告诉Shell:"命令还没结束,下一行是它的继续",可以去掉 \ 并写成一行
  • 这条命令在 info.log 文件中,搜索同时匹配以下三种模式之一的日志行:
匹配的关键词 含义
Parameters of creating a task 后端创建任务时记录的参数(代表后端收到了创建请求)。
Parameters of issuing a task 后端下发任务给机器人时记录的参数(代表指令已发出)。
Receive task action type 机器人端收到任务动作时打印的日志(代表机器人收到了指令)。
  • | 在基础正则中,| 只是一个普通字符,必须用反斜杠\ 转义才能表示"逻辑或"的意思。

  • 示例2:查看错误和心跳

markdown 复制代码
grep -nE "ERROR|Heartbeat" /tmp/robot.log | tail -n 3
-   `-n`:显示行号
-   `-E`:启用 `|` 逻辑或
-   `tail -n 3`:只取最后 3 条
  • 示例2:查看某个时间段的日志
perl 复制代码
grep "2026-06-24 14:3[0-5]" /tmp/info.log
 `14:3[0-5]` 匹配 14:30 到 14:35
  • 示例3:排除干扰行,只看关键信息
perl 复制代码
grep -v "DEBUG" /tmp/app.log | grep "ERROR"
先剔除所有 DEBUG 行,再从剩余内容中找 ERROR。
  • 示例4
bash 复制代码
grep -B 2 -A 5 "NullPointerException" /tmp/app.log
显示 NullPointerException 出现的前 2 行和后 5 行上下文。
  • 示例5: 管道符 | 的黄金搭档
perl 复制代码
# 查看正在运行的 Python 进程
ps aux | grep python

# 查看历史命令,快速定位 docker 操作
history | grep docker

# 查看日志尾部 100 行,再抓 ERROR
tail -n 100 app.log | grep ERROR

二.crul 常用命令

curl 命令学习指南

服务器地址: http://192.168.242.128:8000 所有测试接口前缀: /test/


速记表

参数 作用 示例
-X 指定 HTTP 方法 -X POST
-d 请求体数据 -d '{"a":1}'
-H 添加请求头 -H "Content-Type: application/json"
-F 表单/文件上传 -F "file=@./a.txt"
-b 发送 Cookie -b "key=value"
-c 保存 Cookie 到文件 -c cookies.txt
-v 详细输出(调试必用) -v
-i 显示响应头 -i
-L 跟随重定向 -L
-I 只看响应头(HEAD 请求) -I
-o 保存响应体到文件 -o output.png
-w 格式化输出变量 -w "%{http_code}"
-s 静默模式 -sS
--max-time 总超时秒数 --max-time 5
--connect-timeout 连接超时秒数 --connect-timeout 3

1. 基础 HTTP 方法

bash 复制代码
curl http://192.168.242.128:8000/test/method

最简单的 GET 请求curl 默认就是 GET 方法,所以不需要加 -X。浏览器在地址栏输入 URL 本质上也是发 GET 请求。

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/method

-X 指定 HTTP 方法。POST 通常用于"创建/提交"数据。这里演示的是同一个 URL 对不同方法返回不同结果。

bash 复制代码
curl -X PUT http://192.168.242.128:8000/test/method

PUT 通常用于"全量替换"资源。比如更新用户全部信息,会把所有字段都覆盖掉。

bash 复制代码
curl -X PATCH http://192.168.242.128:8000/test/method

PATCH 通常用于"局部更新"。比如只改用户手机号,其他字段不动。比 PUT 更轻量。

bash 复制代码
curl -X DELETE http://192.168.242.128:8000/test/method

DELETE 删除资源。语义明确,一看就知道要删东西。

2. 详细输出控制

bash 复制代码
curl -v http://192.168.242.128:8000/test/method

-v(verbose)显示完整的请求头和响应头> 开头的行是 curl 发出去的,< 开头的行是服务器返回的。调试必用。

bash 复制代码
curl -i http://192.168.242.128:8000/test/method

-i(include)在响应体前面带上响应头 。和 -v 的区别:-i 不显示请求头、不显示 TLS 握手信息,输出更干净。

bash 复制代码
curl -sS http://192.168.242.128:8000/test/method

-s(silent)静默模式,不显示进度条;-S(show-error)配合 -s 时仍然显示错误信息。适合写在脚本里

bash 复制代码
curl -w '\n耗时: %{time_total}s\n' http://192.168.242.128:8000/test/echo

-w(write-out)输出格式化变量%{time_total} 是总耗时,还有其他如 %{http_code}(状态码)、%{size_download}(下载字节数)等。\n 是换行。


3. 路径参数

bash 复制代码
curl http://192.168.242.128:8000/test/path/42

URL 路径中的 42 被服务端提取为参数。RESTful API 的典型风格/user/42 表示 id 为 42 的用户。

bash 复制代码
curl http://192.168.242.128:8000/test/path/books/99

多个路径参数books 是分类,99 是 id。层级关系一目了然。

bash 复制代码
curl http://192.168.242.128:8000/test/path/optional/a/b/c/d

通配路径/a/b/c/d 整段被捕获为一个字符串。常用于文件路径、嵌套资源等场景。

4. 查询参数(Query String)

bash 复制代码
curl "http://192.168.242.128:8000/test/query?name=Tom&age=25&page=2&size=5"

? 后面是查询参数,key=value 格式,多个用 & 连接。必须加引号 ,否则 & 会被 shell 解释为后台运行。

bash 复制代码
curl "http://192.168.242.128:8000/test/query?tags=a&tags=b&tags=c"

同名参数传多次 = 数组 。服务端收到 tags=["a","b","c"]。这是 HTTP 协议传数组的标准方式。


5. JSON 请求体

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/body/json -H "Content-Type: application/json" -d '{"name":"张三","age":30,"city":"北京"}'

拆解:

  • -X POST:指定 POST 方法
  • -H "Content-Type: application/json"告诉服务端"我发的是 JSON",服务端据此解析
  • -d '{"name":"张三"...}'-d 是请求体数据。单引号保护 JSON 内部的双引号不被 shell 解释
bash 复制代码
curl -X POST http://192.168.242.128:8000/test/body/typed -H "Content-Type: application/json" -d '{"name":"Tom","age":25,"tags":["dev","ops"]}'

和上一个类似,但数据中有嵌套数组 ["dev","ops"],服务端会做强类型校验(name 必须是字符串、age 必须是数字)。

6. 表单提交

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/body/form -d 'username=admin&password=123456&remember=true'

注意没有 -H "Content-Type" 。curl 不给 -d 加 Content-Type 时,它会把 Content-Type 自动设为 application/x-www-form-urlencoded,这就是普通 HTML 表单的提交方式。key=value&key=value 的格式。

7. 文件上传

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/upload -F "file=@./test.txt" -F "description=一段说明"

拆解:

  • -F(form)模拟 HTML 表单的文件上传 ,Content-Type 自动设为 multipart/form-data
  • file=@./test.txt@ 表示读取本地文件内容 发送,没有 @ 就是普通字符串
  • 一个 -F 就是一个表单字段,可以有多个
bash 复制代码
curl -X POST http://192.168.242.128:8000/test/upload/multi -F "files=@./a.txt" -F "files=@./b.txt"

同一字段名传多个文件,服务端收到一个文件数组。和查询参数的数组逻辑一样。

8. 请求头

bash 复制代码
curl http://192.168.242.128:8000/test/headers

不加任何自定义头,看 curl 默认发了什么 。你会看到 User-Agent: curl/x.x.xAccept: */* 等 curl 自带的信息。

bash 复制代码
curl http://192.168.242.128:8000/test/headers/user-agent -H "User-Agent: MyCurlApp/1.0"

-H(header)添加自定义请求头。这里伪装成自己的 App 名称。服务器可以据此识别客户端类型。

bash 复制代码
curl http://192.168.242.128:8000/test/headers/custom -H "X-Custom-Token: secret123"

自定义头通常以 X- 开头(历史惯例),用于传递 Token、追踪 ID 等自定义信息。

bash 复制代码
curl http://192.168.242.128:8000/test/headers/auth -H "Authorization: Bearer eyJhbGciOi..."

Authorization 是 HTTP 标准的认证头Bearer 是令牌类型(最常见的是 JWT),eyJ... 是 Base64 编码的令牌内容。几乎所有需要登录的 API 都用这个头传递身份信息。


bash 复制代码
curl http://192.168.242.128:8000/test/cookies -b "session=abc123; uid=42"

-b(cookie)发送 Cookie 给服务器 。格式是 name=value; name=value。服务端收到后可以用来识别用户、维持会话。

bash 复制代码
curl http://192.168.242.128:8000/test/cookies/set -c cookies.txt

-c(cookie-jar)把服务器返回的 Set-Cookie 保存到本地文件 cookies.txt 。下次请求用 -b cookies.txt 就能带上这些 Cookie,实现类似浏览器的"记住登录状态"。

10. 状态码

bash 复制代码
curl -o NUL -w "%{http_code}\n" http://192.168.242.128:8000/test/status/200

拆解:

  • -o NUL:把响应体丢进垃圾桶(Windows 是 NUL,Linux/Mac 是 /dev/null),只关心状态码
  • -w "%{http_code}\n":输出 HTTP 状态码 + 换行
  • 200 = 成功
bash 复制代码
curl -o NUL -w "%{http_code}\n" http://192.168.242.128:8000/test/status/301

301 = 永久重定向(资源已永久迁移到新地址,浏览器会记住)

bash 复制代码
curl -o NUL -w "%{http_code}\n" http://192.168.242.128:8000/test/status/404

404 = 未找到(客户端输错了 URL 或资源不存在)

bash 复制代码
curl -o NUL -w "%{http_code}\n" http://192.168.242.128:8000/test/status/500

500 = 服务器内部错误 (代码崩了、数据库挂了等)。4xx 是客户端的错,5xx 是服务端的错

11. 重定向

bash 复制代码
curl -L http://192.168.242.128:8000/test/redirect?target=/test/method

-L(Location)自动跟随重定向 。服务端返回 302 + Location: /test/method,curl 会自动向新地址再发一次请求。不加 -L 只会看到 302 状态码,不会跳转

bash 复制代码
curl -L -v http://192.168.242.128:8000/test/redirect?target=/test/method

-L -v 配合,可以看到两次请求的全过程:第一次返回 302,第二次拿到最终结果。

bash 复制代码
curl -I http://192.168.242.128:8000/test/redirect

-I(head)只发 HEAD 请求,只拿响应头 。可以检查重定向目标而不下载响应体。等同于 curl --head


12. 超时测试

bash 复制代码
curl --max-time 2 http://192.168.242.128:8000/test/slow/5

--max-time 2整个请求最多等 2 秒 ,超时就断开。服务端要 5 秒才响应 → curl 报错退出。用于测试服务端响应速度、设置调用方超时保护

bash 复制代码
curl --connect-timeout 1 http://192.168.242.128:8000/test/slow/1

--connect-timeout 1只限制 TCP 连接阶段的超时 (1 秒内连不上就放弃)。连接建立后的传输时间不受此限制。--max-time 是总计时,--connect-timeout 只管连接。


13. 不同响应格式

bash 复制代码
curl http://192.168.242.128:8000/test/format/html

返回 HTML 页面 。Content-Type 是 text/html。浏览器渲染的就是这种。curl 虽然不渲染,但能看到完整 HTML 结构。

bash 复制代码
curl http://192.168.242.128:8000/test/format/text

返回纯文本 ,Content-Type 是 text/plain。最简单的响应格式,不含任何标记。

bash 复制代码
curl http://192.168.242.128:8000/test/format/binary -o out.png

-o out.png把响应体保存为文件 out.png ,不做终端输出。二进制数据直接输出到终端会乱码,所以用 -o 保存。-O(大写)会用远程文件名自动保存。

14. CRUD 完整流程

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/crud/item -H "Content-Type: application/json" -d '{"name":"苹果","price":5.5}'

C = Create(创建):POST + JSON 请求体 → 服务端存入内存字典,返回带 id 的对象。

bash 复制代码
curl "http://192.168.242.128:8000/test/crud/items?page=1&size=5"

R = Read(列表读取):GET + 分页参数 → 返回第 1 页,每页最多 5 条。

bash 复制代码
curl http://192.168.242.128:8000/test/crud/item/1

R = Read(单个读取):用路径参数指定 id=1 → 返回该条详情,不存在则 404。

bash 复制代码
curl -X PUT http://192.168.242.128:8000/test/crud/item/1 -H "Content-Type: application/json" -d '{"name":"香蕉","price":3.0}'

U = Update(全量替换) :PUT 必须传所有字段,服务端会完全覆盖。和 PATCH 的区别在这里体会最明显。

bash 复制代码
curl -X PATCH http://192.168.242.128:8000/test/crud/item/1 -H "Content-Type: application/json" -d '{"price":9.9}'

U = Update(局部修改) :PATCH 只传要改的字段 。这里只改 pricename 保持原值。RESTful 最佳实践。

bash 复制代码
curl -X DELETE http://192.168.242.128:8000/test/crud/item/1

D = Delete(删除):删除 id=1 的资源。真正的删除操作需要鉴权,这里只是演示语义。

15. 万能 Echo(强烈推荐第一个试这个)

bash 复制代码
curl -X POST "http://192.168.242.128:8000/test/echo?foo=bar" -H "X-Custom: hello" -b "session=test" -d '{"msg":"hello world"}'

学习 curl 最实用的接口。一条命令同时用到了:

  • -X POST(指定方法)
  • ?foo=bar(查询参数)
  • -H "X-Custom: hello"(自定义头)
  • -b "session=test"(Cookie)
  • -d '{"msg":"hello world"}'(JSON 请求体)

服务端把所有信息原样返回,你就能看到 curl 实际发了什么

16. 请求体大小探测

bash 复制代码
curl -X POST http://192.168.242.128:8000/test/body/size -H "Content-Type: application/json" -d '{"data":"hello"}'

服务端会告诉你请求体有多少字节。试着把 -d 的数据改大改小,观察字节数变化。

17. 查看所有测试接口

bash 复制代码
curl http://192.168.242.128:8000/test

测试接口的目录页 ,列出 /test 下所有可用接口及其方法。忘记有哪些接口时先打这个。


常见 HTTP 状态码一览

状态码 含义 类型
200 成功 2xx 成功
201 已创建 2xx 成功
204 无内容(删除成功常用) 2xx 成功
301 永久重定向 3xx 重定向
302 临时重定向 3xx 重定向
400 请求错误(参数不对) 4xx 客户端错误
401 未认证(没登录) 4xx 客户端错误
403 禁止访问(没权限) 4xx 客户端错误
404 未找到 4xx 客户端错误
429 请求太频繁 4xx 客户端错误
500 服务器内部错误 5xx 服务端错误
502 网关错误 5xx 服务端错误
503 服务不可用 5xx 服务端错误
相关推荐
stringwu1 小时前
Flutter 开发必备:MVI 架构的高效实现指南
前端·flutter
用户2136610035723 小时前
Vue2组件化开发与父子通信
前端·vue.js
Momo__3 小时前
TypeScript satisfies 操作符——比 as 更安全的类型守门员
前端·typescript
用户2136610035723 小时前
Vue2事件系统与指令进阶
前端·vue.js
labixiong3 小时前
实现一个能跑的迷你版Promise(一)
前端·javascript·面试
Csvn5 小时前
`??` 和 `||` 搞混,线上用户头像全挂了
前端
kyriewen5 小时前
白宫前脚下了限制令,OpenAI 后脚就把 GPT-5.6 发了
前端·gpt·openai
用户40269244819086 小时前
CRMEB Pro 新增后台接口全链路:路由、权限、验证器、返回格式一次讲清
前端·后端
泉城老铁7 小时前
springboot+vue+ ffmpeg 实现视频的拉流播放
前端