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 查看完整选项列表和详细说明。

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

相关推荐
AlfredZhao6 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346612 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪13 小时前
linux 拷贝文件或目录到指定的位置
linux
大树881 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质1 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
Inhand陈工1 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智1 天前
ARP代理--工作原理
运维·网络·arp·arp代理