【shell】grep命令用法详解

一、基本概念

grep​(Global Regular Expression Print)是 Linux/Unix 中用于文本搜索的核心工具。其核心功能是:

  • 在文件或输入流中匹配指定模式(支持正则表达式)。
  • 输出包含匹配模式的行,支持高亮显示、行号标记等。
  • 支持递归搜索目录、多文件处理及复杂过滤逻辑。

二、语法结构
grep [选项] [模式] [文件...]
grep [选项] [-e 模式 | -f 模式文件] [文件...]

示例

grep "error" /var/log/syslog       # 在 syslog 中搜索包含 "error" 的行
grep -r "TODO" ~/projects          # 递归搜索项目目录中所有含 "TODO" 的文件

三、常用选项
选项说明
基础匹配
-i忽略大小写(grep -i "warning" file
-v反向匹配​(输出不包含模式的行)
-w匹配整个单词(避免部分匹配,如 grep -w "test" 不匹配 "testing")
-x匹配整行(行内容必须完全等于模式)
输出控制
-n显示匹配行的行号(grep -n "error" log.txt
-c仅统计匹配的行数(grep -c "404" access.log
--color=auto高亮显示匹配内容
-o仅输出匹配的文本片段(非整行)
多文件处理
-r / -R递归搜索目录(grep -r "func" src/
-l仅输出包含匹配的文件名(grep -rl "deprecated" .
-L输出不包含匹配的文件名
上下文查看
-A NUM显示匹配行后 NUM 行(After)
-B NUM显示匹配行前 NUM 行(Before)
-C NUM显示匹配行前后各 NUM 行(Context)
模式扩展
-E启用扩展正则表达式(等价 egrep
-F禁用正则,按字面文本匹配(等价 fgrep
-f FILE从文件读取匹配模式(每行一个模式)

四、正则表达式元字符
元字符说明示例
基础匹配
.匹配任意单个字符(除换行符)gr.p → "grep", "gr3p"
*匹配前一个字符 0 次或多次go*gle → "ggle", "google"
+匹配前一个字符 1 次或多次(需 -Ego+gle → "gogle", "google"
?匹配前一个字符 0 或 1 次(需 -Ecolou?r → "color", "colour"
锚定位置
^匹配行首^start → 行以 "start" 开头
$匹配行尾end$ → 行以 "end" 结尾
\< / \>匹配单词边界\<the\> → 独立单词 "the"
字符集
[...]匹配括号内任意字符[aeiou] → 匹配任意元音字母
[^...]匹配不在括号内的字符[^0-9] → 匹配非数字字符
``逻辑或(需 -E
分组与引用
()分组(需 -E(abc)+ → 匹配 "abc", "abcabc"
\n引用第 n 个分组(需 -E(a.)\1 → 匹配 "abab"

五、典型应用场景
1. ​搜索日志中的错误信息
grep -n --color "CRITICAL" /var/log/app.log      # 显示行号和高亮
grep -C 3 "panic" debug.log                     # 查看错误上下文
2. ​统计代码中特定关键词
grep -r -c "#TODO" src/                         # 统计每个文件的 TODO 数量
grep -w -o "function_[a-z]+" code.js | sort | uniq -c  # 提取并统计函数名
3. ​过滤命令输出
ps aux | grep "nginx"                           # 查找 Nginx 进程
netstat -tuln | grep ":80 "                     # 检查 80 端口占用
4. ​批量处理文件
# 列出所有含 "user@example.com" 的配置文件
grep -rl "user@example.com" /etc/*.conf

# 删除所有空行(结合 sed)
grep -v "^$" input.txt > output.txt
5. ​复杂正则匹配
# 匹配 IPv4 地址(简化版)
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log

# 匹配日期格式 YYYY-MM-DD
grep -E "\b[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\b" dates.txt
六、命令实例
  1. 在文件中搜索字符串

    grep 'hello' file.txt

    在 file.txt 中搜索包含 hello 的行。

  2. 忽略大小写搜索

    grep -i 'hello' file.txt

    在 file.txt 中搜索包含 helloHelloHELLO 等不区分大小写的行。

  3. 显示匹配的行号

    grep -n 'hello' file.txt

    在 file.txt 中搜索包含 hello 的行,并显示行号。

  4. 反转匹配

    grep -v 'hello' file.txt

    在 file.txt 中搜索不包含 hello 的行。

  5. 递归搜索目录

    grep -r 'hello' /path/to/directory

    在 /path/to/directory 目录及其子目录中递归搜索包含 hello 的行。

  6. 只输出匹配的文件名

    grep -l 'hello' *.txt

    在当前目录中搜索所有 .txt 文件,只输出包含 hello 的文件名。

  7. 使用正则表达式

    grep -E 'hello|world' file.txt

    在 file.txt 中搜索包含 hello 或 world 的行(使用扩展正则表达式)。

  8. 显示匹配行及其前后行

    grep -C 2 'hello' file.txt

    在 file.txt 中搜索包含 hello 的行,并显示其前后各 2 行。

  9. 搜索固定字符串

    grep -F 'exact_string' file.txt

    在 file.txt 中搜索完全匹配 exact_string 的行(不使用正则表达式)。

七、注意事项
  1. 引号与特殊字符

    • 模式中包含空格或特殊符号(如 $*)时,需用单引号包裹:
      grep 'price: $5.99' file.txt
    • 使用 -F 可避免正则解析(直接匹配 * 或 $ 等字符)。
  2. 性能优化

    • 对大文件优先使用 -m NUM 限制匹配行数(如 grep -m 100 "error")。
    • 递归搜索时指定目录层级(结合 find 过滤文件类型)。
  3. 正则兼容性

    • grep 默认使用基本正则表达式​(BRE)。
    • 使用 -E 或 egrep 启用扩展正则表达式(ERE),支持 +?| 等。
  4. 二进制文件处理

    • 使用 -a 强制将二进制文件视为文本搜索。
    • 使用 -I 忽略二进制文件。

通过灵活组合选项和正则表达式,grep 可高效完成日志分析、文本过滤、数据提取等任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值