【学习笔记】Linux 文本三剑客:grep 命令指南

Linux 文本三剑客:grep 命令指南

在 Linux 系统中,grep 是文本搜索与分析的核心工具,能快速从文件 / 目录中定位包含特定模式(字符串、正则表达式)的内容。它衍生出的 egrep(扩展正则)和 fgrep(快速匹配),也各自承担着不同场景的搜索需求。本文将从 “基础用法→正则进阶→工具对比”,带你吃透 grep 家族。

一、grep 命令:从 “全局正则打印” 说起

1. 命令由来与核心作用

grep 全称是 Global Regular Expressions Print(全局正则表达式打印),源于 Unix 早期对 “正则匹配 + 内容输出” 的需求:

  • 「Global」:全局扫描文件内容;
  • 「Regular Expressions」:支持正则表达式匹配复杂模式;
  • 「Print」:将匹配到的行打印到屏幕。

核心功能:在一个或多个文件中,搜索与 “字符模式(或正则表达式)” 匹配的内容,仅显示包含匹配模式的行(不修改原文件)。

2. 基本语法与工作逻辑

grep [选项] 模式 文件名
  • 模式:可以是纯字符串、单词,也可以是正则表达式;
  • 文件名:支持单个文件、多个文件,甚至目录(结合递归选项);
  • 工作逻辑:逐行扫描文件,只要某一行 “部分内容” 匹配模式,就会被打印。

3. 正则表达式:grep 的 “灵魂”

正则表达式是描述 “字符串集合” 的模式,通过元字符(通配符)组合出灵活的匹配规则。grep 支持基本正则表达式(BRE),部分元字符需转义才能恢复 “特殊含义”。

常用元字符(BRE 规则)
元字符含义示例
c*匹配 0 个或多个字符 cc 为任意字符)a* 匹配 ""(空)、aaaaaa
[xyz]匹配方括号中任意一个字符[Ss]ignal 匹配 Signal 或 signal
[^xyz]匹配除方括号中字符外的所有字符[^0-9] 匹配非数字字符
^锁定行的开头^root 匹配以 root 开头的行
$锁定行的结尾bash$ 匹配以 bash 结尾的行
.匹配一个非换行符的任意字符e.e 匹配 eveeae,不匹配 ee
注意:元字符的 “转义”

基本正则表达式中,*+{|() 等元字符会 “失去特殊含义”,需加反斜杠 \ 转义(如 \*\+\{)才能表示原本的正则功能。

二、grep 常用选项:精准控制搜索行为

grep 提供丰富的选项,可实现 “忽略大小写、显示行号、递归搜索” 等需求。以下是高频选项与示例:

选项含义示例
-c仅输出包含匹配模式的行数(不是匹配次数)grep -c "error" app.log → 统计日志中含 “error” 的行数
-i忽略大小写匹配grep -i "Linux" readme.txt → 匹配 LinuxlinuxLINUX
-l仅列出包含匹配行的文件名(多文件搜索时用)grep -l "config" /etc/* → 列出 /etc/ 下含 “config” 的文件名
-n显示匹配行的行号grep -n "password" passwd → 显示含 “password” 的行及行号
-v反向匹配:列出不包含模式的行grep -v "root" passwd → 显示不含 “root” 的行
-w匹配完整单词(避免 “部分匹配”,如 “test” 不匹配 “testing”)grep -w "test" code.py → 仅匹配完整单词 “test”
-r递归搜索目录下的所有文件(含子目录)grep -r "init" /etc/ → 递归搜索 /etc/ 下含 “init” 的文件内容
-o仅显示匹配的部分(而非整行)grep -o "[0-9]+" nums.txt → 只提取文件中的数字串
-E使用扩展正则表达式(等价于 egrep`grep -E "a+b+" data.txt→ 匹配一个或多个a,或一个或多个 b`

实操示例

  1. 搜索员工文件中 “职位为 CLERK” 的行:

    grep "CLERK" emp.data
    
  2. 查找以 78 开头的行(正则匹配行首):

    grep "^78" emp.data
    
  3. 递归搜索当前目录下,所有包含 “hhh” 的文件及内容:

    grep -rn "hhh" ./
    
  4. 忽略大小写,显示匹配行的行号:

    grep -in "hhh" tmp.txt
    

三、egrep:扩展正则的 “快捷方式”

egrep 等价于 grep -E,核心差异是支持 “扩展正则表达式(ERE)”—— 元字符(*+|() 等)无需转义,直接使用特殊含义。

核心优势:简化正则写法

  • 基本正则(grep):grep "a\+" file.txt+ 需转义,匹配 “一个或多个 a”);
  • 扩展正则(egrep):egrep "a+" file.txt+ 直接表示 “一个或多个”)。

实操示例

搜索文件中包含 “早餐”“午餐”“晚餐” 任意一个的行(用扩展正则的 | 表示 “或”):

egrep -rn "早餐|午餐|晚餐" menu.txt

四、fgrep:放弃正则,追求速度

fgrep(或 grep -F)是 “固定字符串” 搜索工具不支持正则表达式,仅匹配 “纯字符串”,但搜索速度远快于 grep/egrep。

适用场景

  • 当你明确知道要搜索 “固定字符串”(如特定单词、短语),且不需要正则的灵活匹配时;
  • 大文件快速搜索(避免正则引擎的性能开销)。

实操示例

快速搜索文件中包含 “hello world” 的行:

fgrep "hello world" large_file.log

五、grep 家族对比:选对工具,效率翻倍

工具等价命令正则类型元字符是否需转义速度适用场景
grep基本正则(BRE)中等需简单正则,或兼容旧脚本
egrepgrep -E扩展正则(ERE)中等需复杂正则(+、`()` 等)
fgrepgrep -F无(固定字符串)最快纯字符串匹配,大文件快速搜索

六、高级技巧:grep 与其他命令联动

grep 常与管道 | 结合,实现 “先过滤、后处理” 的工作流。

示例:统计日志中 “ERROR” 的行数,并按日期排序

# 1. 过滤含“ERROR”的行 → 2. 提取日期列 → 3. 排序去重 → 4. 统计次数
cat app.log | grep "ERROR" | awk '{print $1}' | sort | uniq -c

示例:搜索包含制表符(\t)的行

方法一(利用 $'...' 语法):

grep $'hello\tworld' example.txt

方法二(利用 Perl 正则,需 grep -P):

grep -P "hello\tworld" example.txt

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

君之嘞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值