|
| 1 | +# rg 使用指南与日志排查速查表 |
| 2 | + |
| 3 | +`rg`(ripgrep)是命令行里最常用的文本搜索工具之一,速度快,默认会自动跳过 `.gitignore` 中的内容,也比传统 `grep` 更适合代码库和日志目录。 |
| 4 | + |
| 5 | +本文分两部分: |
| 6 | + |
| 7 | +1. 基础使用指南:帮助你快速上手 `rg` |
| 8 | +2. 查日志常用操作:直接复制就能用的命令模板 |
| 9 | + |
| 10 | +--- |
| 11 | + |
| 12 | +## 1. 基础语法 |
| 13 | + |
| 14 | +```powershell |
| 15 | +rg [选项] PATTERN [PATH ...] |
| 16 | +``` |
| 17 | + |
| 18 | +常见例子: |
| 19 | + |
| 20 | +```powershell |
| 21 | +rg error |
| 22 | +rg "timeout" |
| 23 | +rg -n -i "connection refused" logs |
| 24 | +rg -F "GET /health" .\logs\app.log |
| 25 | +``` |
| 26 | + |
| 27 | +说明: |
| 28 | + |
| 29 | +- `PATTERN` 默认按正则表达式处理 |
| 30 | +- `PATH` 不写时,默认搜索当前目录 |
| 31 | +- 在 PowerShell 中,优先使用单引号包裹模式,例如 `rg 'error|warn'` |
| 32 | +- 如果只是查固定字符串,不需要正则,优先用 `-F`,更快也更稳 |
| 33 | + |
| 34 | +--- |
| 35 | + |
| 36 | +## 2. 最常用参数 |
| 37 | + |
| 38 | +| 参数 | 作用 | 示例 | |
| 39 | +| :--- | :--- | :--- | |
| 40 | +| `-n` | 显示行号 | `rg -n error` | |
| 41 | +| `-i` | 忽略大小写 | `rg -i timeout` | |
| 42 | +| `-F` | 按固定字符串搜索,不当正则解释 | `rg -F '[ERROR]' logs` | |
| 43 | +| `-w` | 按完整单词匹配 | `rg -w error` | |
| 44 | +| `-v` | 反向匹配,排除命中行 | `rg -v healthcheck app.log` | |
| 45 | +| `-c` | 只显示每个文件的命中次数 | `rg -c error logs` | |
| 46 | +| `-l` | 只显示命中的文件名 | `rg -l timeout src` | |
| 47 | +| `--files` | 列出可搜索文件,不做正文匹配 | `rg --files` | |
| 48 | +| `-g` | 用 glob 限定文件范围 | `rg error -g '*.log'` | |
| 49 | +| `-t` | 按文件类型筛选 | `rg TODO -t ps1` | |
| 50 | +| `-A 3` | 显示命中后 3 行 | `rg -A 3 error app.log` | |
| 51 | +| `-B 3` | 显示命中前 3 行 | `rg -B 3 error app.log` | |
| 52 | +| `-C 3` | 显示命中前后各 3 行 | `rg -C 3 error app.log` | |
| 53 | +| `--hidden` | 包含隐藏文件 | `rg --hidden token .` | |
| 54 | +| `-uuu` | 不忽略隐藏文件、二进制文件、ignore 规则 | `rg -uuu secret .` | |
| 55 | +| `--sort path` | 按路径排序输出 | `rg error logs --sort path` | |
| 56 | +| `--max-count 20` | 最多显示 20 条命中 | `rg --max-count 20 error logs` | |
| 57 | +| `-o` | 仅输出匹配到的片段 | `rg -o '\d{3}' app.log` | |
| 58 | +| `--stats` | 输出搜索统计信息 | `rg error logs --stats` | |
| 59 | + |
| 60 | +--- |
| 61 | + |
| 62 | +## 3. 基础场景 |
| 63 | + |
| 64 | +### 查某个关键词 |
| 65 | + |
| 66 | +```powershell |
| 67 | +rg -n 'timeout' |
| 68 | +``` |
| 69 | + |
| 70 | +### 忽略大小写 |
| 71 | + |
| 72 | +```powershell |
| 73 | +rg -n -i 'error' |
| 74 | +``` |
| 75 | + |
| 76 | +### 查固定文本而不是正则 |
| 77 | + |
| 78 | +如果内容里有 `[`、`]`、`(`、`)`、`.`、`*` 这类字符,优先使用 `-F`: |
| 79 | + |
| 80 | +```powershell |
| 81 | +rg -n -F '[ERROR]' .\logs |
| 82 | +``` |
| 83 | + |
| 84 | +### 只在某类文件里搜 |
| 85 | + |
| 86 | +```powershell |
| 87 | +rg -n 'Invoke-' -g '*.ps1' |
| 88 | +rg -n 'Exception' -g '*.log' .\logs |
| 89 | +rg -n 'TODO' -t md |
| 90 | +``` |
| 91 | + |
| 92 | +### 排除目录或文件 |
| 93 | + |
| 94 | +```powershell |
| 95 | +rg -n 'error' .\logs -g '!archive/**' |
| 96 | +rg -n 'error' .\logs -g '!*.bak' |
| 97 | +``` |
| 98 | + |
| 99 | +### 显示上下文 |
| 100 | + |
| 101 | +排查问题时,上下文通常比“只看到一行命中”更重要: |
| 102 | + |
| 103 | +```powershell |
| 104 | +rg -n -C 2 'NullReferenceException' .\logs\app.log |
| 105 | +rg -n -A 5 'panic' .\logs\service.log |
| 106 | +rg -n -B 3 'Started request' .\logs\api.log |
| 107 | +``` |
| 108 | + |
| 109 | +### 只看命中的文件 |
| 110 | + |
| 111 | +```powershell |
| 112 | +rg -l 'Connection refused' .\logs |
| 113 | +``` |
| 114 | + |
| 115 | +### 统计命中次数 |
| 116 | + |
| 117 | +```powershell |
| 118 | +rg -c 'error' .\logs |
| 119 | +``` |
| 120 | + |
| 121 | +--- |
| 122 | + |
| 123 | +## 4. 正则表达式常用写法 |
| 124 | + |
| 125 | +### 或条件 |
| 126 | + |
| 127 | +```powershell |
| 128 | +rg -n 'error|warn|fatal' .\logs |
| 129 | +``` |
| 130 | + |
| 131 | +### 数字、HTTP 状态码、请求 ID |
| 132 | + |
| 133 | +```powershell |
| 134 | +rg -n '\b5\d{2}\b' .\logs |
| 135 | +rg -n 'requestId[=: ]+[a-zA-Z0-9-]+' .\logs |
| 136 | +``` |
| 137 | + |
| 138 | +### 匹配完整单词 |
| 139 | + |
| 140 | +避免把 `terror` 里的 `error` 也匹配出来: |
| 141 | + |
| 142 | +```powershell |
| 143 | +rg -n -w 'error' .\logs |
| 144 | +``` |
| 145 | + |
| 146 | +### 多条件同时满足 |
| 147 | + |
| 148 | +`rg` 默认不直接写“AND”,通常用 PCRE2: |
| 149 | + |
| 150 | +```powershell |
| 151 | +rg -n -P '(?=.*error)(?=.*orderId=12345)' .\logs\app.log |
| 152 | +``` |
| 153 | + |
| 154 | +说明: |
| 155 | + |
| 156 | +- `-P` 启用 PCRE2,适合高级正则 |
| 157 | +- 复杂正则性能可能明显下降,只在确实需要时使用 |
| 158 | + |
| 159 | +--- |
| 160 | + |
| 161 | +## 5. PowerShell 下的实用写法 |
| 162 | + |
| 163 | +### 搜当前目录所有可搜索文件 |
| 164 | + |
| 165 | +```powershell |
| 166 | +rg --files |
| 167 | +``` |
| 168 | + |
| 169 | +### 搜最近修改的日志文件 |
| 170 | + |
| 171 | +先筛出最近修改的文件,再交给 `rg`: |
| 172 | + |
| 173 | +```powershell |
| 174 | +Get-ChildItem .\logs -File | |
| 175 | + Sort-Object LastWriteTime -Descending | |
| 176 | + Select-Object -First 10 | |
| 177 | + ForEach-Object { rg -n 'error|warn' $_.FullName } |
| 178 | +``` |
| 179 | + |
| 180 | +### 只搜 `.log` 和 `.txt` |
| 181 | + |
| 182 | +```powershell |
| 183 | +rg -n 'timeout' .\logs -g '*.log' -g '*.txt' |
| 184 | +``` |
| 185 | + |
| 186 | +### 输出结果再继续处理 |
| 187 | + |
| 188 | +```powershell |
| 189 | +$matches = rg -n 'error' .\logs |
| 190 | +$matches | Select-Object -First 20 |
| 191 | +``` |
| 192 | + |
| 193 | +--- |
| 194 | + |
| 195 | +## 6. 查日志常用操作 Cheatsheet |
| 196 | + |
| 197 | +下面这些命令适合直接复制后改关键词。 |
| 198 | + |
| 199 | +### 查错误、告警、异常 |
| 200 | + |
| 201 | +```powershell |
| 202 | +rg -n -i 'error|warn|fatal|exception|panic' .\logs -g '*.log' |
| 203 | +``` |
| 204 | + |
| 205 | +### 查某个接口或路径 |
| 206 | + |
| 207 | +```powershell |
| 208 | +rg -n -F 'GET /api/orders' .\logs -g '*.log' |
| 209 | +rg -n -F '/health' .\logs -g '*.log' |
| 210 | +``` |
| 211 | + |
| 212 | +### 查某个用户、订单号、请求 ID |
| 213 | + |
| 214 | +```powershell |
| 215 | +rg -n 'userId=12345' .\logs |
| 216 | +rg -n 'orderId=20260319001' .\logs |
| 217 | +rg -n 'requestId=9f1c2d3e' .\logs |
| 218 | +``` |
| 219 | + |
| 220 | +### 查 5xx / 4xx |
| 221 | + |
| 222 | +```powershell |
| 223 | +rg -n '\b5\d{2}\b' .\logs -g '*.log' |
| 224 | +rg -n '\b4\d{2}\b' .\logs -g '*.log' |
| 225 | +``` |
| 226 | + |
| 227 | +### 查超时、重试、连接失败 |
| 228 | + |
| 229 | +```powershell |
| 230 | +rg -n -i 'timeout|timed out|retry|connection refused|broken pipe' .\logs |
| 231 | +``` |
| 232 | + |
| 233 | +### 查启动失败、配置加载失败 |
| 234 | + |
| 235 | +```powershell |
| 236 | +rg -n -i 'failed to start|startup failed|config.*failed|load.*config' .\logs |
| 237 | +``` |
| 238 | + |
| 239 | +### 查某段时间附近的上下文 |
| 240 | + |
| 241 | +如果你已经知道某个时间点字符串,可以先定位,再带上下文查看: |
| 242 | + |
| 243 | +```powershell |
| 244 | +rg -n -C 5 '2026-03-19 10:15' .\logs\app.log |
| 245 | +rg -n -C 8 '10:15:3' .\logs\app.log |
| 246 | +``` |
| 247 | + |
| 248 | +### 排除噪音日志 |
| 249 | + |
| 250 | +例如排除健康检查、探针、静态资源请求: |
| 251 | + |
| 252 | +```powershell |
| 253 | +rg -n -i 'error|warn' .\logs -g '*.log' | rg -v 'health|/metrics|/favicon.ico' |
| 254 | +``` |
| 255 | + |
| 256 | +### 找出“哪些文件”出现过异常 |
| 257 | + |
| 258 | +```powershell |
| 259 | +rg -l -i 'error|fatal|exception' .\logs -g '*.log' |
| 260 | +``` |
| 261 | + |
| 262 | +### 统计每个日志文件里错误数量 |
| 263 | + |
| 264 | +```powershell |
| 265 | +rg -c -i 'error|fatal|exception' .\logs -g '*.log' |
| 266 | +``` |
| 267 | + |
| 268 | +### 只看前几条命中,快速判断方向 |
| 269 | + |
| 270 | +```powershell |
| 271 | +rg -n -i 'exception|panic' .\logs --max-count 20 |
| 272 | +``` |
| 273 | + |
| 274 | +### 搜压缩日志 |
| 275 | + |
| 276 | +如果日志是 `.gz`、`.zip`、`.bz2` 等压缩格式,可尝试: |
| 277 | + |
| 278 | +```powershell |
| 279 | +rg -n -z 'error|exception' .\logs |
| 280 | +``` |
| 281 | + |
| 282 | +说明: |
| 283 | + |
| 284 | +- `-z` 会尝试搜索常见压缩文件内容 |
| 285 | +- 大文件和压缩包较多时,速度会明显下降 |
| 286 | + |
| 287 | +--- |
| 288 | + |
| 289 | +## 7. 高频组合模板 |
| 290 | + |
| 291 | +### 模板 1:在日志目录中查错误并带上下文 |
| 292 | + |
| 293 | +```powershell |
| 294 | +rg -n -i -C 3 'error|fatal|exception' .\logs -g '*.log' |
| 295 | +``` |
| 296 | + |
| 297 | +### 模板 2:查固定请求路径 |
| 298 | + |
| 299 | +```powershell |
| 300 | +rg -n -F '/api/orders/submit' .\logs -g '*.log' |
| 301 | +``` |
| 302 | + |
| 303 | +### 模板 3:查某个 ID,并看前后 10 行 |
| 304 | + |
| 305 | +```powershell |
| 306 | +rg -n -C 10 'requestId=abc-123' .\logs |
| 307 | +``` |
| 308 | + |
| 309 | +### 模板 4:查错误但过滤健康检查噪音 |
| 310 | + |
| 311 | +```powershell |
| 312 | +rg -n -i 'error|warn|fatal' .\logs -g '*.log' | rg -v 'health|metrics|readiness|liveness' |
| 313 | +``` |
| 314 | + |
| 315 | +### 模板 5:只看最近几个文件里的异常 |
| 316 | + |
| 317 | +```powershell |
| 318 | +Get-ChildItem .\logs -File | |
| 319 | + Sort-Object LastWriteTime -Descending | |
| 320 | + Select-Object -First 5 | |
| 321 | + ForEach-Object { rg -n -i 'error|exception|panic' $_.FullName } |
| 322 | +``` |
| 323 | + |
| 324 | +--- |
| 325 | + |
| 326 | +## 8. 常见坑 |
| 327 | + |
| 328 | +### 正则特殊字符误伤 |
| 329 | + |
| 330 | +这类命令容易搜不准: |
| 331 | + |
| 332 | +```powershell |
| 333 | +rg '[ERROR]' .\logs |
| 334 | +``` |
| 335 | + |
| 336 | +因为 `[]` 会被当成正则字符集合。更稳的写法: |
| 337 | + |
| 338 | +```powershell |
| 339 | +rg -F '[ERROR]' .\logs |
| 340 | +``` |
| 341 | + |
| 342 | +### PowerShell 引号问题 |
| 343 | + |
| 344 | +优先写成: |
| 345 | + |
| 346 | +```powershell |
| 347 | +rg -n 'error|warn' .\logs |
| 348 | +``` |
| 349 | + |
| 350 | +尽量少用双引号,除非你明确需要 PowerShell 变量插值。 |
| 351 | + |
| 352 | +### 没搜到隐藏目录或被 ignore 规则忽略 |
| 353 | + |
| 354 | +```powershell |
| 355 | +rg -n 'secret' . --hidden |
| 356 | +rg -n 'secret' . -uuu |
| 357 | +``` |
| 358 | + |
| 359 | +### 二进制文件默认被跳过 |
| 360 | + |
| 361 | +如果怀疑目标内容在二进制或特殊文件里,可以尝试: |
| 362 | + |
| 363 | +```powershell |
| 364 | +rg -n -uuu 'keyword' . |
| 365 | +``` |
| 366 | + |
| 367 | +--- |
| 368 | + |
| 369 | +## 9. 一句话建议 |
| 370 | + |
| 371 | +- 查固定文本,用 `-F` |
| 372 | +- 排查日志,用 `-n -i -C 3` |
| 373 | +- 先缩小文件范围,再搜正文,例如 `-g '*.log'` |
| 374 | +- 先看前 20 条,再决定是否扩大范围 |
| 375 | +- 复杂 AND 条件最后再上 `-P` |
0 commit comments