当前位置: 首页 > news >正文

⚡️ Linux grep 命令参数详解

⚡️ Linux grep 用法及参数详解

📘 1. grep 简介

grep 是 Linux/Unix 系统中用于文本搜索的命令,其全称为 Global Regular Expression Print,意为全局正则表达式打印器。

它根据给定的 模式(pattern) 对文件或标准输入进行匹配,并输出符合条件的行。


⚙️ 2. grep 用法

🧾 2.1 从标准输入中搜索

grep [参数选项] [匹配表达式]

说明:

  • 不指定文件或路径时,grep 会等待标准输入,可直接通过键盘输入内容后按回车测试匹配行为。
  • 使用 Ctrl + D(Unix)或 Ctrl + Z(Windows)表示输入结束。

📄 2.2 从文件中搜索

grep [参数选项] [匹配表达式] [文件]

说明:

  • grep 会在指定文件中逐行搜索符合表达式的行。
  • grep 支持一次输入多个文件名,自动输出匹配所在的文件名与行内容。

📁 2.3 从目录中递归搜索

grep [参数选项] [匹配表达式] [路径]

说明:

  • grep 可以常配合 -r(递归)或 -R(递归并解析符号链接)选项对目录下的所有文件进行搜索。

🧩 2.4 从其他命令的输出中搜索(配合管道)

[其他命令] | grep [参数选项] [匹配表达式]

说明:

  • grep 可以对命令输出结果进行实时筛选。
  • 这种用法适合日志分析、进程查看、搜索历史记录等场景。

🛠️ 3. grep 参数

📌 3.1 grep 匹配输入参数

🔍 3.1.1 grep 匹配语法参数
  • -G(–basic-regexp):使用基本正则表达式(BRE,默认模式)。
  • -E(–extended-regexp):使用扩展正则表达式(ERE)。
  • -P(–perl-regexp):使用 Perl 风格的正则表达式(需 grep 支持 PCRE 扩展)。
  • -F(–fixed-strings):将匹配模式视为普通字符串,而非正则表达式。

在这四个参数都不存在的情况下,grep 会使用基本正则(-G 模式)。不同正则模式的主要区别在于是否需要对特殊字符(如 +*() 等)进行转义:

  • BRE 中这些字符通常需要转义;
  • EREPCRE 中则可直接使用。
    更多正则语法规则详见:regexp 正则表达式详解 (以后有空更)
🎯 3.1.2 grep 匹配输入项参数
  • -e PATTERN:指定一个匹配模式,可多次使用以指定多个模式。例如:
    grep -e "hello" -e "world" file.txt
    
  • -f FILE:从指定的文件中读取匹配模式(每行一个模式),适用于批量匹配。例如:
    grep -f patterns.txt application.log
    
📏 3.1.3 grep 匹配方式参数:
  • -i(–ignore-case):忽略大小写进行匹配。
  • --no-ignore-case:不忽略大小写(不加-i的话默认就是这个模式,加了这个参数可以覆盖 -i)。
  • -v(–invert-match):反向匹配,输出不匹配的行。
  • -w(–word-regexp):只匹配整个单词,而不是部分单词。效果:

在这里插入图片描述

解释:这里只匹配到了一整个单词的time没有匹配到current_timecheck_time这种半个单词的time

  • -x(–line-regexp):整行匹配,只有整行完全匹配才算成功。效果:

在这里插入图片描述

解释:这里只匹配到了一整行的 import time 没有匹配到一整行的 time

📁 3.1.4 grep 匹配文件与目录参数
  • -a:将二进制文件视为文本文件(用于分析其中可能包含的文本数据)。 效果:

在这里插入图片描述

注意:使用该选项可能导致输出大量乱码(途中的方块问号就是),因为二进制文件中包含非文本字符,会使终端显示异常或不可读字符。

  • --binary-files=binary:遇到二进制文件时的处理方式,把二进制文件当成二进制文件处理(默认行为,不输出匹配内容)。
  • --binary-files=text:遇到二进制文件时的处理方式,把二进制文件当成文本文件处理(和-a差不多,可能导致乱码)。
  • --binary-files=without-match:遇到二进制文件时的处理方式,跳过该文件,不进行匹配(比--bindary-file=binary更省时间)。
  • -d read:对目录的处理方式,读取目录内容(🐍皮玩法,目录有什么好读的)。
  • -d skip:对目录的处理方式,跳过目录(默认行为)。效果:

在这里插入图片描述

解释:这里为了跳过了distbuild目录匹配当前目录下的其他所有文件

  • -D read:匹配设备文件、FIFO、socket 文件时的处理方式,尝试读取这些特殊文件(🐍皮玩法,设备有什么好读的)。
  • -D skip:匹配设备文件、FIFO、socket 文件时的处理方式,跳过这些文件(默认行为)。效果:

在这里插入图片描述

解释:这里跳过设备文件(一般只有在/dev目录下才有设备文件,我这里虚空演示就当他有了)递归匹配当前目录下所有文件

  • --exclude=GLOB:匹配时跳过文件名符合 GLOB 模式的文件。效果:

在这里插入图片描述

解释: 不匹配二进制文件,同时排除所有html和py文件

  • --exclude-from=FILE:从 FILE 文件中读取 GLOB 模式来排除文件。
  • --exclude-dir=GLOB:排除指定模式的目录。
  • --include=GLOB:只匹配文件名符合 GLOB 模式的文件。 效果:

在这里插入图片描述

解释:这里只搜索toc文件

  • -r:递归处理目录。
  • -R:递归处理目录,并解析符号链接。

⚜️ 3.2 grep 匹配输出参数

📤 3.2.1 grep 全局输出参数
  • -c:只显示每个文件中匹配的行数。 效果:

请添加图片描述

解释: 这里在Table.py文件中搜索到了14条记录

  • --color=auto(默认):当输出目标为终端时高亮,重定向到文件或管道时不高亮。
  • --color=never:不高亮显示匹配内容。
  • --color=always:始终高亮显示匹配内容。效果:

请添加图片描述

解释:看到他红了没?

  • -l:只列出匹配结果的文件名。效果:

在这里插入图片描述

解释:和下图比较,这张图表示搜到的有time的文件

  • -L:只列出没有匹配结果的文件名。效果:

在这里插入图片描述

解释:和上图比较,这张图表示搜到的没有time的文件

  • -m NUM:最多匹配 NUM 条后停止搜索。效果:

在这里插入图片描述

注意:这张图表示我搜到的2条time的记录,但是经过我测试 -m NUM 参数对目录递归搜索不管用

  • -o:只输出匹配的部分内容,而不是整行,常用于提取正则表达式匹配到的字段。效果:

在这里插入图片描述

解释:正则表达式匹配到的类似xxx_time的字段,需要注意的是,由于我屏幕太窄,grep命令中的Table.py换行显示了,Table.py不是搜索到的结果(真想给他一拳)

  • -q:静默模式,不输出任何匹配内容,适用于脚本中只关心匹配结果的情况。
  • -s:抑制错误信息输出,例如文件不存在时不会报错,适合批量操作。

📝 3.2.2 grep 行输出参数
  • -b:在输出中显示每行前的字节偏移量。效果:

在这里插入图片描述

解释: 这里表示grep分别在第248、2024、2073……个字符的地方发现了time

  • -h:不要在输出中显示文件名(默认,即使匹配多个文件)。
  • -H:始终显示匹配行的文件名(即使只匹配一个文件)。效果

在这里插入图片描述

解释:输出结果每行前面加了个文件名,方便你递归搜索的时候找文件

  • -n:显示匹配行的行号。效果:

在这里插入图片描述

解释: 输出结果在每行前面加了行号,方便你用sed命令定位修改

  • -T:保持 Tab 字符宽度一致,利于对齐(仅在部分实现中有效)。效果:

在这里插入图片描述

解释:和上张图对比,只对齐了冒号,可见实际并没什么🥚用


🧱 3.2.3 grep 上下文输出参数
  • -A NUM:显示匹配行 之后 的 NUM 行。效果:

在这里插入图片描述

解释:显示了check_time后面的5行

  • -B NUM:显示匹配行 之前 的 NUM 行。效果:

在这里插入图片描述

解释:显示了check_time前面的5行

  • -C NUM:显示匹配行 前后 各 NUM 行。效果:

在这里插入图片描述

解释:check_out前后都有了

  • --no-group-separator:匹配段之间不显示分隔符。(默认)
  • --group-separator=SEP:自定义匹配项之间的分隔符。(要配合-A ,-B -C使用) 效果:

在这里插入图片描述

解释:这里可以自定义分隔符,我定义了===他就显示===了。这条命令一定要配合-A 、-B、-C使用,否则分隔符显示不出来

🧪 3.3 grep 特殊用法参数(除了--以外都是🐍皮玩法,你这辈子都不一定会用到)

  • --line-buffered:按行刷新输出(通常 grep 默认采用块缓冲)。适合实时处理输出,例如日志流分析。例如:
    tail -f /var/log/syslog | grep --line-buffered "fail"
    
  • -U, --binary:以二进制模式读取文件,保留 Windows 文件中的 \r(回车符)。适用于对二进制数据或特定格式的分析。例如:
    grep -U $'\r\n' windows_data.txt
    
  • -z(–null-data):将 ASCII NUL (\0) 字符视为换行符,适用于处理以 NUL 分隔的记录,例如一些 tar 输出或 find -print0 的结果。例如:
    grep -z "hello" nul_separated.txt
    
  • -Z:在输出中使用 ASCII NUL (\0) 分隔匹配的文件名,适用于配合 xargs -0 等工具处理文件名中包含空格或换行的情况。例如:
    grep -rlZ "TODO" . | xargs -0 sed -i 's/TODO/DONE/g'
    
  • --label=LABEL:当输入为标准输入(如管道)时,强制为其命名(显示为文件名),以便区分多来源的输出。例如:
    echo "error: disk full" | grep --label=stdin "error"
    
  • --:标志参数结束,后续所有内容一律按文件名或匹配表达式处理(即使看起来像参数)。用于防止文件名被误识别为选项。例如:
    grep "main" -- --filename-starts-with-dash.c
    

⚠️ 4. 注意事项

⛔️ 4.1 grep -F 报错或卡死

在使用 grep 的 -F 参数来匹配固定字符串的时候可能会出现卡死或报错,就像这样:

在这里插入图片描述

解释:这里我希望搜索 grep --help 中和 --fixed-string参数有关的信息,但是 grep 给我报错了,说我格式不对

或者是这样:

在这里插入图片描述

解释:这里我希望搜索 grep_man.txt 这个文件里面和--fixed-string 参数有关的信息,但是 grep 给我直接卡住了

原因很简单,grep 把--fixed 当成了参数而不是匹配表达式,所以第一条命令缺少了匹配表达式,第二条命令缺少文件名,直接给我当成从终端输入,卡在那里等待我输入。

解决方法就是在-F 参数后面添加 -- 告诉 grep -F 后面没有参数了,跟的不是匹配表达式就是文件名,效果:

在这里插入图片描述


📖 参考资料
GNU grep 官方文档(在线)

相关文章:

  • JavaSE 字符串:深入解析 String、StringBuilder与 StringBuffer
  • Playwright 测试框架 - Node.js
  • 【算法】分支限界
  • 第二章 AI大模型接入
  • 【仿muduo库实现并发服务器】使用正则表达式提取HTTP元素
  • 密码学:解析Feistel网络结构及实现代码
  • SCAU8642--快速排序
  • 本地部署 DeepSeek R1(最新)【从下载、安装、使用和调用一条龙服务】
  • 迅速止痒的4个方法: 冷敷、冰敷、炉甘石洗剂、薄荷膏
  • Python基础入门:开启编程之旅
  • Python----目标检测(使用YOLO 模型进行线程安全推理和流媒体源)
  • 腾答知识竞赛系统功能介绍
  • PyTorch——卷积层(3)
  • 2025年5月24日系统架构设计师考试题目回顾
  • Windows环境下Scoop包管理工具的全面指南
  • 数智管理学(十六)
  • 计算机视觉NeRF
  • 在Linux中配置内网可访问的YUM光盘源
  • Docker安装Redis集群(3主3从+动态扩容、缩容)保姆级教程含踩坑及安装中遇到的问题解决
  • 一元函数积分
  • 手机网站开发视频/营销公司取名字大全
  • 手机做网站教程/2023第二波疫情已经到来了
  • 宁夏枸杞网站建设方案/百度站长工具怎么关闭教程视频
  • 注册网站需要什么程序/学软件开发学费多少钱
  • 长沙奶茶加盟网站建设/子域名大全查询
  • 北京做网站推广兼职/百度广告多少钱