Linux grep 命令

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


基本语法

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

常用选项

选项 功能
-i 忽略大小写(如 grep -i "hello" file 匹配 hello、HELLO)
-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}:匹配前一个字符 n 到 m 次

      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),这样可以避免系统兼容性问题。

注意事项

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

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

相关推荐
在角落发呆3 小时前
工具配置备份步骤:从手动备份到自动化方案
运维·windows·自动化
_upupup4 小时前
Linux的调试工具——gdb/cgdb
linux·服务器
百度一下吧4 小时前
Nginx 使用手册:从安装配置到实战部署
运维·nginx
JeJe同学5 小时前
Docker镜像导入、容器启动
linux·运维·docker
Jason_zhao_MR5 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
回眸&啤酒鸭5 小时前
【回眸】自动化白盒测试落地实战指南
运维·自动化·log4j
闲云野鹤在人间6 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
一个风轻云淡7 小时前
GCC 和 GDB命令简单解读
java·linux·前端
H.莓飛7 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
资料库017 小时前
Linux 8个常见运维故障排查
java·linux·运维