当前位置: 首页 > 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 匹配输入参数

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

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

  • BRE 中这些字符通常需要转义;
  • EREPCRE 中则可直接使用。
    更多正则语法规则详见:regexp 正则表达式详解 (以后有空更)
🎯 grep 匹配输入项参数
  • -e PATTERN:指定一个匹配模式,可多次使用以指定多个模式。例如:
    grep -e "hello" -e "world" file.txt
    
  • -f FILE:从指定的文件中读取匹配模式(每行一个模式),适用于批量匹配。例如:
    grep -f patterns.txt application.log
    
📏 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

📁 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 匹配输出参数

📤 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:抑制错误信息输出,例如文件不存在时不会报错,适合批量操作。

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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


🧱 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
    

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

http://www.xdnf.cn/news/772399.html

相关文章:

  • Python:操作 Excel 格式化
  • 数据库管理-第332期 大数据已死,那什么当立?(20250602)
  • 关于replacedialog控件问题指南
  • JavaSwing中使用JxBroser与JavaScript进行异步通信
  • Rust 变量与可变性
  • 【Day43】
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段(10):语法单词
  • 手机归属地查询接口如何用Java调用?
  • 【存储基础】SAN存储基础知识
  • 专业数据对比工具推荐
  • Python 训练 day40
  • 揭秘 CompletedFuture 的设计精髓(深入实现分析)
  • 九.C++ 对引用的学习
  • 统计随机行走的结构占比
  • JDK21深度解密 Day 12:大规模迁移JDK21方法论
  • PAT-甲级JAVA题解(更新中...)
  • RGB888色彩格式转RGB565格式
  • 海外tk抓包简单暴力方式
  • 从 Windows 7 到 AnduinOS:安装、故障排除与远程控制指南
  • NLP学习路线图(十八):Word2Vec (CBOW Skip-gram)
  • 光伏功率预测 | BiLSTM多变量单步光伏功率预测(Matlab完整源码和数据)
  • 文件索引:数组、二叉树、二叉排序树、平衡树、红黑树、B树、B+树
  • 并查集(上)
  • javaFX eclipse配置
  • Redis数据类型操作命令
  • 考研系列—操作系统:(补充)第七章、输入输出系统
  • 第12次12: 修改和删除收货地址
  • 普通二叉树 —— 最近公共祖先问题解析(Leetcode 236)
  • 专业C++Qt开发服务,助力您的软件项目腾飞!
  • 二叉树的构建与逆构建/二叉查找树与替罪羊树