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

Linux grep命令

简介

grep 是 Global Regular Expression Print 的缩写。

这个名字来源于 g/re/p 这个古老的 ed 编辑器命令:

  • g = global (全局)

  • re = regular expression (正则表达式)

  • p = print (打印)

所以 grep 的基本含义就是“使用正则表达式全局搜索并打印匹配的行”。


补充信息:

  • grep 是 Unix/Linux 系统中一个非常强大的文本搜索工具

  • 它使用正则表达式来搜索文本,并输出匹配的行

  • 常见的变体包括:

    • egrep (Extended GREP) - 支持扩展正则表达式

    • fgrep (Fixed GREP) - 快速搜索固定字符串,不支持正则表达式

    • rgrep - 递归搜索

简单示例:

grep "hello" file.txt      # 在 file.txt 中搜索 "hello"
grep -r "error" /var/log/  # 递归搜索 /var/log/ 目录中的所有文件

这个工具由 Ken Thompson 在 1974 年开发,至今仍然是每个 Linux/Unix 用户必备的工具之一。

 

用途

在文件中搜索模式。

语法

grep [ -E | -F ] [ -i ] [ -h ] [ -H ] [ -L ] [ -r | -R ] [ -s ][ -u ] [ -v ] [ -w ] 
[ -x ] [ -y ] [ [ [ -b ] [ -n ] ] | [ -c | -l | -q ] ] [ -p [ Separator ] ] { [ -e PatternList ... ] [ -f PatternFile ... ] | PatternList ... } 
[ -U [ -I ] unicode_hex_notation_pattern ] [ File ... ]
 

描述

grep 命令搜索由 Pattern 参数指定的模式,并将每个匹配行写入标准输出。 这些模式是 ed 或 egrep 命令样式的有限正则表达式。 grep 命令使用压缩非确定性算法。

如果在 File 参数中指定了多个名称,那么 grep 命令将显示包含匹配行的文件的名称。 对 shell 有特殊意义的字符($、"*、"[、"|"、"^"、"(、")、"\)出现在模式参数中时,必须用引号标出。 当模式参数不是简单字符串时,必须用单引号括起整个模式。 在 [a-z] 这样的表达式中,-(减号) cml 指定一个范围,根据当前整理顺序。 整理顺序可定义等价类以供在字符范围中使用。 如果未指定任何文件,grep 会假定为标准输入。

注意:
  1. 不要对特殊文件运行 grep 命令,这样做可能产生不可预计的结果。 输入行不能包含空字符。
  2. 输入文件必须以换行符结尾。
  3. 正则表达式不匹配换行符。
  4. 虽然可以同时指定若干标志,但有些标志会覆盖其他标志。 例如,-l 选项将优先于所有其他标志。 另外,如果您同时指定了 -E 和 -F 标志,那么后指定的那个会有优先权。

标志

表 1. 标志
描述
-b 在每行前面加上找到该行的块号码。 使用此标志有助于按照上下文查找磁盘块号码。 -b标志不能与来自 "stdin或管道的输入一起使用。
-c 仅显示匹配行的计数。
-E 将指定的每个模式视为扩展正则表达式 (ERE)。 ERE 的空值将匹配所有的行。
注: 带有 -E 标志的 grep 命令与 egrep 命令相同,但错误消息和使用情况消息不同, -s 标志的功能也不同。
-e PatternList 指定一个或多个搜索模式。 该标记与简单的模式搜索类似,但在模式以 -(减号)开头时非常有用。 模式必须由换行符分隔。 连续使用两个换行符或者在引号后加上换行符 ("\n) 可以指定空模式。 除非同时指定了 -E 或 -F 标志,否则每个模式都将被视作基本正则表达式 (BRE)。 grep接受多个 -e 和 -f 标志。 行匹配时会使用所有指定的模式,但未指定评估顺序。
-F 将每个指定的模式视作字符串而不是正则表达式。 空字符串可匹配所有的行。
注: 带有 -F 标志的 grep 命令与 fgrep 命令相同,但错误消息和使用情况消息不同, -s 标志的功能也不同。
-f PatternFile 指定包含搜索模式的文件。 每个模式都必须以换行符分隔,空行被视为 NULL 模式。 每种模式都将被视作基本的正则表达式 (BRE),除非同时指定了 -E 或 -F 标志。
-h 阻止将包含匹配行的文件的名称追加到该行。 当指定多个文件时,将禁止文件名。
-H 如果指定了 "-r或 "-R选项,并且在命令行中指定了指向目录类型文件的符号链接,则 "grep命令会搜索符号链接指向的目录中的文件及其后文件层次结构中的所有文件。
-i 在进行比较时忽略字母的大小写。
开始更改-I 结束更改 开始更改指定搜索基于指定 Unicode 十六进制符号模式的松散匹配。 大多数正则表达式引擎都提供不区分大小写的匹配,作为唯一的松散匹配。 如果表达式引擎将不区分大小写匹配作为唯一的松散匹配,那么表达式引擎必须考虑到 ASCII 字符之外的大量大小写 Unicode 字符。
注意:"-I标记只能与 "-U标记一起使用。
结束更改
-l 仅列示(一次)包含匹配行的文件的名称。 文件名之间用换行符加以分隔。 如果搜索标准输入,那么将返回路径名 StandardInput 。 -l标记与 "-c标记和 "-n标记的任何组合都与 "-l标记相同。
-L 如果指定了 "-r或 "-R选项,并且在命令行中指定了指向目录类型文件的符号链接,或在遍历文件层次结构时遇到该符号链接,则 "grep命令会搜索符号链接指向的目录中的文件及其后文件层次结构中的所有文件。 如果同时指定了 -H 和 -L ,那么命令行上指定的最后一个选项将生效。
-n 在每一行之前放置文件中相关的行号。 每个文件的起始行号为 1,在处理每个文件时,行计数器都将被复位。
-p[分隔符] 显示包含匹配行的整个段落。 段落之间将使用 Separator 参数指定的段落分隔符加以分隔,这些分隔符的模式与搜索模式有着相同的格式。 包含段落分隔符的行将仅用作分隔符;它们不会包含在输出中。 缺省的段落分隔符是空白行。
-q 禁止所有写入到标准输出的操作,不管是否为匹配行。 如果选择了输入行,那么以零状态退出。 具有 -c, -l和 -n 标志的任意组合的 -q 标志的行为仅与 -q 标志类似。
-r 递归地搜索目录。 在缺省情况下,按照到目录的链接。
-R 递归地搜索目录。 在缺省情况下,不按照到目录的链接。
-s 禁止通常针对不存在或不可读文件写入的错误消息。 其他的错误消息并未被禁止。
-u -u标记会导致输出无缓冲。
开始更改-U 单编码十六进制注释模式结束更改 开始更改 -U标志打开 Unicode 标志。 正则表达式编写者可能没有使用 Unicode 字符集来指定需要搜索的模式。 此外,使用键盘可能无法为主要书面语言的每个字符输入统一码定义的码位。 因此,unicode_hex_notation_pattern模式的值必须是字符的 Unicode 定义码位的十六进制表示。 For example, to represent the 𝄞 character, whose Unicode-defined code point is U+1D11E, the value of 单编码十六进制注释模式 can be the hexadecimal representation as \U0001D11E\x{1D11E}, or \u{1D11E}.
注意:
  • grep 命令的功能与带有 -U 标志的 ugrep 命令的功能相同。
  • -U标志不能与 "grep命令的传统标志一起使用。
结束更改
-v 显示所有与指定模式不匹配的行。
-w 执行单词搜索。
-x 显示与指定模式精确匹配而不含其他字符的行。
-y 当进行比较时忽略字母的大小写。
PatternList 指定将在搜索中使用的一个或多个模式。 这些模式将被视为使用 "-e标记指定的模式。
文件 指定将对其进行模式搜索的文件的名称。 如果未给出 File 变量,将使用标准输入。

退出状态

本命令返回以下退出值:

表 2。 退出状态
描述
重大安全事件数量 找到匹配项。
第 1 年 未找到匹配项。
>1 发现语法错误,或者文件不可访问(即使找到了匹配项)。

示例

  1. 要使用包含部分模式匹配字符 "*, ^, ?, [, ], \(, \), \{,和 "\}的模式,请输入以下命令:
    grep  "^[a-zA-Z]"  pgm.s 
     
    这将显示 "pgm.s文件中第一个字符为字母的每一行。
  2. 要显示与模式不匹配的所有行,请输入以下命令:
    grep   -v  "^#" pgm.s
     
    这将显示 "pgm.s文件中第一字符不是 "#(磅号)的每一行。
  3. 要显示 file1 文件中与 abc 或 xyz 字符串匹配的所有行,请输入以下命令:
    grep -E "abc|xyz"  file1
     
  4. 要在 "test2文件中搜索 "$(美元符号),请输入以下命令:
    grep \\$ test2
     
    为了强制 shell 将 \$ (单反斜杠,美元符号) 传递到 grep 命令,必须使用 \\ (双反斜杠) 字符。 \(单反斜杠)字符可通知 grep 命令将其后的字符(本例中为 $)视作原义字符而不是表达式字符。 如果使用 fgrep 命令,那么可以不必使用反斜杠之类的转义字符。
  5. 要通过 /tmp 进行递归搜索以查找具有单词 IBM 的文件,而不通过指向目录的链接进行递归搜索,请输入以下命令:
    grep –R IBM /tmp
     

    grep –r -H IBM /tmp
     
  6. 要通过 "/tmp进行递归搜索,找到包含 "IBM的文件,并通过链接进行递归搜索,请输入以下命令:
    grep –r IBM /tmp
     

    grep -R -L IBM /tmp
     
  7. 开始更改要在 regex_test.txt 文件中搜索字符  ,其 Unicode 定义的码位是 U+6211 ,十六进制表示法是 \u6211 ,请输入以下命令:
    grep -U "\u6211" regex_test.txt
     
    要搜索多个字符,可以添加一个 Unicode 定义码点的十六进制表示列表,不留空格。 例如,要搜索 regex_test.txt 文件中的字符  和  ,请输入以下命令:
    grep -U “\u0918\u0930" regex_test.txt
     
    结束更改
  8. 开始更改
    要指定要在 "regex_test.txt文件中搜索的代码点 "U+6200和 "U+6300之间的字符范围,请输入以下命令:
    grep -U "[\u6200-\u6300]" regex_test.txt
     
    要在 "regex_test.txt文件中指定 "U+6200和 "U+6300之间也是大写字母的字符范围进行搜索,请输入以下命令:
    grep -U "[\u0000-\U0010FFFF--\p{Lu}]" regex_test.txt
     
    结束更改
  9. 开始更改要对字符 𐐥 进行松散匹配搜索,其 Unicode 定义的代码点为 U+10425 ,十六进制表示为 \U00010425 ,请输入以下命令:
    grep -U -I "\U00010425" regex_test.txt
     
    结束更改
  10. 开始更改要在 regex_test.txt 文件中搜索带有小数位的数字,请输入以下命令:
    grep -U "\p{Nd}" regex_test.txt
     
    其中 "Nd是一个 Unicode 字符属性,用于包含小数位的数字。结束更改
  11. 开始更改要在 regex_test.txt 文件中搜索日语平假名字符,请输入以下代码:
    grep -U "\p{Hiragana}" regex_test.txt
     
    结束更改

文件

表 3. 文件
描述
/usr/bin/grep 包含 grep 命令。
http://www.hskmm.com/?act=detail&tid=34562

相关文章:

  • 物品复活软件开发记录 - CelestialZ
  • 螺纹钢的中线节奏
  • 2022 ICPC Hangzhou
  • KL散度
  • Win11常用的bat脚本
  • 随便记
  • Map与Map.Entry的区别
  • 真诚
  • 历史和线段树
  • 大数据分析之MySQL学习2
  • [KaibaMath]1012 关于收敛数列保号性的推论的证明
  • 申公豹说
  • 赛前训练 12 树的直径、中心和重心
  • 关于无人巡航小车的学习笔记
  • 详细介绍:springboot+vue智慧旅游管理小程序(源码+文档+调试+基础修改+答疑)
  • 存算一体架构的先行者:RustFS在异构计算环境下的探索与实践
  • 2-SAT
  • CSP-S模拟10
  • CSP-S模拟赛加赛 比赛总结
  • 我要好好写博客了 - Milo
  • 洛谷P4735--最大异或和
  • DAPO代码实现浅析
  • [KaibaMath]1011 关于收敛数列保号性的证明
  • Appium 3.0:跨平台移动自动化测试框架全面解析
  • 赛前训练 12 extra 树上差分倍增
  • 塔吊施工人员操作合规性监测!思通数科 AI 卫士实时守护作业安全
  • Dos命令1
  • 题解:P1073 [NOIP 2009 提高组] 最优贸易
  • 吩咐
  • 互评五