Linux——grep命令使用笔记


整体说明

  • 常用记忆:
    • 找内容用 -r,忽略大小写 -i
    • 只要文件名 -l,统计个数 -c
    • 看上下文 -C,画重点 --color
    • 过滤垃圾用 -v,静默判断用 -q

grep 命令家族

  • grep 命令还包含些变体:
    命令 本质 适用场景
    grep 基础命令 普通字符串搜索
    egrep 等同于 grep -E 使用扩展正则(不用加反斜杠转义 {} + ? |
    fgrep 等同于 grep -F 搜索纯固定字符串(不解析正则),搜索特殊字符(如 $ *)时极快
    rgrep 等同于 grep -r 递归搜索子目录

核心参数/选项及其解释

  • 匹配控制类
    参数 作用
    -i 忽略大小写(最常用)
    -v 反向匹配(显示不包含该字符串的行)
    -w 匹配整个单词(不会匹配到部分词,如搜 log 不会命中 logistics
    -x 匹配整行(行内容必须完全等于模式)
    -E 使用扩展正则(egrep
    -F 将模式视为固定字符串(fgrep
    -P 使用 Perl 正则(支持 \d \s 等,Linux GNU grep 专属 ,macOS 需 brew install grep
  • 输入输出控制类
    参数 作用
    -l 只输出匹配的文件名(不显示具体行)
    -L 输出匹配的文件名(反向文件列表)
    -n 显示匹配行的行号
    -c 只输出匹配的行数(统计个数)
    -o 只输出匹配到的部分(不输出整行,提取手机号/邮箱必备)
    -q 静默模式(无任何输出,仅通过 $? 返回值判断是否找到,用于 if 判断)
    -s 不显示“文件不存在”或“无法读取”的错误信息
  • 上下文控制类(排查日志神技)
    参数 作用
    -A n 显示匹配行及后面 (After) n 行
    -B n 显示匹配行及前面 (Before) n 行
    -C n 显示匹配行及前后 (Context) 各 n 行
  • 文件与目录遍历类
    参数 作用
    -r / -R 递归搜索子目录(-R 会跟随符号链接)
    --include=*.ext 只搜索指定后缀的文件(如 --include=*.go
    --exclude=*.log 排除指定后缀的文件
    --exclude-dir=dir 排除指定目录(如 --exclude-dir=.git
    -a 将二进制文件当做文本文件处理(强行搜索二进制)
    -I 忽略二进制文件(默认推荐加上,避免终端乱码)

正则表达式

  • 基础正则(BRE,默认无需加参数)
    元字符 含义
    ^ 匹配行首(如 ^Error
    $ 匹配行尾(如 .$ 匹配最后字符)
    . 匹配任意单个字符(除换行符)
    * 匹配前一个字符 0 次或多次
    [abc] 匹配括号内任意一个字符
    [^abc] 匹配不在括号内的任意字符
    \ 转义特殊字符(如搜 IP 需写 \.
  • 扩展正则(ERE,需加 -E 或使用 egrep
    元字符 含义
    + 匹配前一个字符 1 次或多次
    ? 匹配前一个字符 0 次或 1 次
    {n,m} 匹配前一个字符 n 到 m 次(如 [0-9]{4}
    | (逻辑 OR,如 error|fatal
    () 分组(如 (abc){2} 匹配 abcabc
  • Perl 正则(-P,极强但依赖库)
    元字符 含义
    \d 匹配数字(等同 [0-9]
    \s 匹配空白符(空格/Tab)
    \w 匹配单词字符(字母、数字、下划线)
    (?=abc) 正向预查(匹配后面是 abc 的字符串)

常用命令笔记

  • 代码/文本搜索 场景

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 1. 在当前目录所有 .py 文件中搜索 "main",显示行号
    grep -rn --include="*.py" "main" ./

    # 2. 搜索但排除 .git 和 node_modules 目录(代码搜索黄金组合)
    grep -r --color=auto --exclude-dir={.git,node_modules,dist} "function_name" ./

    # 3. 只列出包含 "TODO" 的文件名
    grep -rl "TODO" ./src/

    # 4. 找出所有不包含 "license" 的文件
    grep -L "license" *.txt
  • 日志分析 场景

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 1. 搜索错误并显示前后 5 行上下文
    grep -C 5 "ERROR" /var/log/app.log

    # 2. 搜索凌晨 02:00 到 03:00 之间的日志(配合正则)
    grep "^2026-08-31 02:" app.log

    # 3. 实时跟踪日志并高亮关键报错(tail + grep)
    tail -f /var/log/system.log | grep --color=auto "error\|panic"

    # 4. 统计某个接口调用了多少次
    grep -c "GET /api/v1/user" access.log
  • 提取数据(配合 -o 和管道)场景

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 1. 提取文本中的所有邮箱地址
    grep -oE "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt

    # 2. 提取所有 IPv4 地址
    grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" file.txt

    # 3. 提取所有 19 位手机号(中国)
    grep -oP "1[3-9]\d{9}" file.txt # 需要 -P 支持

    # 4. 只提取 JSON 中 "id" 字段的值(假设格式标准)
    grep -oP '"id":\s*"\K[^"]+' data.json

附录:系统运维与进程管理

  • Linux 系统运维常用命令:

    1
    2
    3
    4
    5
    6
    7
    8
    # 1. 查找包含 nginx 的进程(排除 grep 自身进程)——经典技巧
    ps aux | grep [n]ginx # 中括号让 grep 匹配 "nginx" 但不匹配自己的命令行

    # 2. 查看历史命令中 git 提交记录(不包含 help)
    history | grep "git commit" | grep -v "help"

    # 3. 查看 CPU 信息(只提取型号)
    cat /proc/cpuinfo | grep "model name" | uniq
  • 脚本中的条件判断

    1
    2
    3
    4
    5
    # 检查日志是否包含 "FATAL",包含则发报警
    if grep -q "FATAL" /var/log/app.log; then
    echo "发现致命错误!" >&2
    exit 1
    fi

附录:高级技巧

grep + find(处理超大目录或复杂文件名过滤)

  • grep -r 无法精细控制文件修改时间,用 find 配合:

    1
    2
    3
    4
    5
    # 搜索最近 7 天内修改过的、大于 1MB 的文件中的 "password"
    find /var/log -type f -mtime -7 -size +1M -exec grep -l "password" {} \;

    # 安全处理带空格的文件(使用 xargs -0)
    find . -name "*.yml" -print0 | xargs -0 grep -n "port"
  • grep + sed / awk(批量替换)

    1
    2
    3
    4
    5
    # 找出所有包含 "old_ip" 的文件,并批量替换为 "new_ip"
    grep -rl "192.168.1.1" ./config/ | xargs sed -i 's/192.168.1.1/10.0.0.1/g'

    # 找出所有包含 "TODO" 的文件并统计每个文件的数量
    grep -c "TODO" $(grep -rl "TODO" ./src/)
  • 多行匹配(跨行搜索)

    • 默认 grep 按行读,若想匹配跨行的 beginend
      1
      2
      3
      4
      5
      # 方法1:使用 -z 将文件视为单行(适合小文件)
      grep -Pzo "begin.*?end" file.txt

      # 方法2:使用 pcregrep(更专业)
      pcregrep -M "begin(\n|.)*?end" file.txt

附录:注意事项

  • 优先加 -F :如果搜的是普通字符串(如 http://),加 -F 可跳过正则解析,速度提升数倍
  • 大文件用 -m 1grep -m 1 "error" huge.log 找到第一个就停止,避免读完整文件
  • 慎用 -r 扫根目录
    • 永远别 grep -r / 除非加了 --exclude-dir={proc,sys,dev},否则会卡死
  • 管道中多用 LC_ALL=C
    • 放在命令开头 LC_ALL=C grep "abc",跳过 Unicode 编码检测,加速明显
  • -I 保护终端
    • 如果不小心搜了二进制文件(.so .bin),终端会输出乱码,加上 -I 自动忽略