Linux grep 命令

grep 是 Linux/Unix 系统中用于文本搜索的强大工具,支持基于正则表达式的模式匹配。以下是其详细用法及实际应用示例:


基本语法

bash 复制代码
grep [选项] 模式 [文件...]
  • 模式:要搜索的字符串或正则表达式。
  • 文件:可以是单个文件或多个文件,也可以通过管道符传递输入。

常用选项

选项 功能
-i 忽略大小写(如 grep -i "hello" file 匹配 helloHELLO
-v 反向匹配(显示不包含模式的行)
-n 显示匹配行的行号
-l 仅显示包含匹配项的文件名
-c 统计匹配行的数量
-r / -R 递归搜索目录中的文件(-R 不跟随符号链接)
-w 全字匹配(如 -w "error" 不匹配 error123
-x 匹配整行(如 -x "apple" 只匹配整行 apple
-A NUM 显示匹配行及其后 NUM
-B NUM 显示匹配行及其前 NUM
-C NUM 显示匹配行及前后各 NUM
-H 显示文件名(多文件时默认开启)
-m NUM 最多显示 NUM 个匹配项
-q 静默模式(仅返回状态码,0 表示匹配成功)
-E 使用egrep命令
-color = auto 为grep过滤结果添加颜色

正则表达式

grep 支持 基本正则表达式(BRE)扩展正则表达式(ERE)

  1. 基本正则表达式(BRE)【默认支持】

    • .:匹配任意单个字符

      bash 复制代码
      grep "a.b" file.txt  # 匹配 "aab"、"acb" 等
    • *:匹配前一个字符 0 次或多次

      bash 复制代码
      grep "go*gle" file.txt  # 匹配 "ggle"、"google" 等
    • ^:匹配行首

      bash 复制代码
      grep "^start" file.txt  # 匹配以 "start" 开头的行
    • $:匹配行尾

      bash 复制代码
      grep "end$" file.txt  # 匹配以 "end" 结尾的行
  2. 扩展正则表达式(ERE)

    • |:逻辑"或"

      bash 复制代码
      grep -E "error|fail" log.txt  # 匹配 "error" 或 "fail"
    • +:匹配前一个字符 1 次或多次

      bash 复制代码
      grep -E "go+gle" file.txt  # 匹配 "gogle"、"google" 等
    • ?:匹配前一个字符 0 次或 1 次

      bash 复制代码
      grep -E "colou?r" file.txt  # 匹配 "color" 或 "colour"
    • {n,m}:匹配前一个字符 nm

      bash 复制代码
      grep -E "a{2,4}" file.txt  # 匹配 "aa"、"aaa" 或 "aaaa"
  3. 字符集合

    • [abc]:匹配任意一个字符(a、b 或 c)

      bash 复制代码
      grep "[0-9]" file.txt  # 匹配任意数字
    • [^abc]:匹配不在集合中的字符

      bash 复制代码
      grep "[^0-9]" file.txt  # 匹配非数字字符

扩展知识BRE、ERE

BRE(基本正则表达式)
  • 支持的元字符^(行首)、$(行尾)、.(任意单个字符)、*(零次或多次匹配)、[](字符集)、\{m,n\}(重复次数)。

  • 需要转义的元字符

    • ():需要转义为 \(...\) 才能表示分组。
    • {}:需要转义为 \{m,n\} 才能指定重复次数。
    • |:需要转义为 \| 才能表示"或"操作。
  • 示例

    bash 复制代码
    # 匹配以 "error" 开头的行(BRE)
    grep '^error' /var/log/syslog
    
    # 匹配连续 3 到 5 个数字(BRE)
    grep '[0-9]\{3,5\}' /var/log/syslog
ERE(扩展正则表达式)
  • 支持的元字符:BRE 的所有元字符,外加以下扩展:

    • +:前一个字符出现 1 次或多次
    • ?:前一个字符出现 0 次或 1 次
    • {m,n}:前一个字符出现 m 到 n 次(无需转义)。
    • ():分组(无需转义)。
    • |:逻辑"或"操作(无需转义)。
  • 无需转义+?{}()|

  • 示例

    bash 复制代码
    # 匹配 "error" 或 "fail"(ERE)
    grep -E 'error|fail' /var/log/syslog
    
    # 匹配连续 3 到 5 个数字(ERE)
    grep -E '[0-9]{3,5}' /var/log/syslog

高级用法

  1. 递归搜索

    bash 复制代码
    grep -r "error" /var/log/  # 在 /var/log 目录及其子目录中搜索 "error"
  2. 统计匹配行数

    bash 复制代码
    grep -c "success" file.txt  # 统计 file.txt 中包含 "success" 的行数
  3. 显示上下文

    bash 复制代码
    grep -A 2 -B 1 "keyword" file.txt  # 显示匹配行、前1行和后2行
  4. 多模式匹配

    bash 复制代码
    grep -e "pattern1" -e "pattern2" file.txt  # 同时搜索 pattern1 和 pattern2
  5. 排除特定文件类型

    bash 复制代码
    grep --include="*.log" "error" /path/  # 仅搜索 .log 文件
    grep --exclude="*.tmp" "error" /path/   # 排除 .tmp 文件
  6. 高亮匹配内容

    bash 复制代码
    grep --color=auto "keyword" file.txt  # 匹配内容高亮显示

常见场景示例

  1. 忽略大小写搜索

    bash 复制代码
    grep -i "linux" file.txt  # 匹配 "Linux"、"LINUX" 等
  2. 查找不包含某字符串的行

    bash 复制代码
    grep -v "skip" file.txt  # 显示不包含 "skip" 的行
  3. 统计匹配行数

    bash 复制代码
    grep -c "404" access.log  # 统计日志中 404 错误的数量
  4. 递归搜索并显示文件名

    bash 复制代码
    grep -rl "TODO" /project/  # 列出 /project/ 中包含 "TODO" 的文件名
  5. 使用正则表达式

    bash 复制代码
    grep -E "^#include" file.c  # 匹配以 #include 开头的行
    grep -o "\b[0-9]\+\b" file.txt  # 仅输出所有独立的数字

egrep核心区别

特性 grep egrep
正则表达式类型 基本正则表达式 (BRE) 扩展正则表达式 (ERE)
性能 更快(处理简单模式) 稍慢(处理复杂模式)
语法灵活性 需要转义特殊字符(如 ` , +`)
系统兼容性 所有 Unix/Linux 系统均支持 部分系统(如 macOS)可能不预装
等效命令 grep(默认) grep -E(与 egrep 等效)

简单总结

  • grep:适合简单模式匹配,兼容性更好,性能更高。
  • egrep:适合复杂模式匹配,语法更简洁,但性能稍逊。
  • 在实际使用中,如果需要扩展正则表达式功能,推荐使用 grep -E(等效于 egrep),这样可以避免系统兼容性问题。

注意事项

  • 扩展正则表达式 :使用 egrepgrep -E 启用更灵活的正则语法(如 +?() 分组)。
  • 搜索结果太多 :分页查看:grep "pattern" file.txt | less
  • 性能优化 :搜索大文件时,使用 -m 限制匹配数量或 --binary-files=without-match 跳过二进制文件。
  • 帮助文档 :通过 man grep 查看完整选项列表和详细说明。

如果有意见和或者建议欢迎留言讨论!

相关推荐
Yana.nice3 分钟前
openssl将证书从p7b转换为crt格式
java·linux
AI逐月7 分钟前
tmux 常用命令总结:从入门到稳定使用的一篇实战博客
linux·服务器·ssh·php
小白跃升坊35 分钟前
基于1Panel的AI运维
linux·运维·人工智能·ai大模型·教学·ai agent
跃渊Yuey1 小时前
【Linux】线程同步与互斥
linux·笔记
杨江1 小时前
seafile docker安装说明
运维
舰长1151 小时前
linux 实现文件共享的实现方式比较
linux·服务器·网络
好好沉淀1 小时前
Docker开发笔记(详解)
运维·docker·容器
zmjjdank1ng1 小时前
Linux 输出重定向
linux·运维
路由侠内网穿透.1 小时前
本地部署智能家居集成解决方案 ESPHome 并实现外部访问( Linux 版本)
linux·运维·服务器·网络协议·智能家居
树℡独1 小时前
ns-3仿真之应用层(三)
运维·服务器·ns3