简介
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 命令搜索由 Pattern 参数指定的模式,并将每个匹配行写入标准输出。 这些模式是 ed 或 egrep 命令样式的有限正则表达式。 grep 命令使用压缩非确定性算法。
如果在 File 参数中指定了多个名称,那么 grep 命令将显示包含匹配行的文件的名称。 对 shell 有特殊意义的字符($
、"*
、"[
、"|
"、"^
"、"(
、")
、"\
)出现在模式参数中时,必须用引号标出。 当模式参数不是简单字符串时,必须用单引号括起整个模式。 在 [a-z] 这样的表达式中,-(减号) cml 指定一个范围,根据当前整理顺序。 整理顺序可定义等价类以供在字符范围中使用。 如果未指定任何文件,grep 会假定为标准输入。
注意:
- 不要对特殊文件运行 grep 命令,这样做可能产生不可预计的结果。 输入行不能包含空字符。
- 输入文件必须以换行符结尾。
- 正则表达式不匹配换行符。
- 虽然可以同时指定若干标志,但有些标志会覆盖其他标志。 例如,-l 选项将优先于所有其他标志。 另外,如果您同时指定了 -E 和 -F 标志,那么后指定的那个会有优先权。
标志
项
|
描述
|
---|---|
-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标记只能与 "-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标记会导致输出无缓冲。 |
𝄞 character, whose Unicode-defined code point is U+1D11E , the value of 单编码十六进制注释模式 can be the hexadecimal representation as \U0001D11E , \x{1D11E} , or \u{1D11E} .
注意:
|
|
-v | 显示所有与指定模式不匹配的行。 |
-w | 执行单词搜索。 |
-x | 显示与指定模式精确匹配而不含其他字符的行。 |
-y | 当进行比较时忽略字母的大小写。 |
PatternList | 指定将在搜索中使用的一个或多个模式。 这些模式将被视为使用 "-e标记指定的模式。 |
文件 | 指定将对其进行模式搜索的文件的名称。 如果未给出 File 变量,将使用标准输入。 |
退出状态
本命令返回以下退出值:
项
|
描述
|
---|---|
重大安全事件数量 | 找到匹配项。 |
第 1 年 | 未找到匹配项。 |
>1 | 发现语法错误,或者文件不可访问(即使找到了匹配项)。 |
示例
- 要使用包含部分模式匹配字符 "
*, ^, ?, [, ], \(, \), \{,
和 "\}
的模式,请输入以下命令:pgm.s文件中第一个字符为字母的每一行。这将显示 " - 要显示与模式不匹配的所有行,请输入以下命令:
pgm.s文件中第一字符不是 "
#
(磅号)的每一行。
这将显示 " - 要显示 file1 文件中与
abc
或xyz
字符串匹配的所有行,请输入以下命令: - 要在 "test2文件中搜索 "
$
(美元符号),请输入以下命令:\$
(单反斜杠,美元符号) 传递到 grep 命令,必须使用\\
(双反斜杠) 字符。\
(单反斜杠)字符可通知 grep 命令将其后的字符(本例中为$
)视作原义字符而不是表达式字符。 如果使用 fgrep 命令,那么可以不必使用反斜杠之类的转义字符。 - 要通过 /tmp 进行递归搜索以查找具有单词
IBM
的文件,而不通过指向目录的链接进行递归搜索,请输入以下命令:或
- 要通过 "/tmp进行递归搜索,找到包含 "
IBM
的文件,并通过链接进行递归搜索,请输入以下命令:或
要在 regex_test.txt 文件中搜索字符
我
,其 Unicode 定义的码位是 U+6211 ,十六进制表示法是\u6211
,请输入以下命令:要搜索多个字符,可以添加一个 Unicode 定义码点的十六进制表示列表,不留空格。 例如,要搜索 regex_test.txt 文件中的字符घ
和र
,请输入以下命令:- 要指定要在 "regex_test.txt文件中搜索的代码点 "
U+6200
和 "U+6300
之间的字符范围,请输入以下命令:要在 "regex_test.txt文件中指定 "U+6200
和 "U+6300
之间也是大写字母的字符范围进行搜索,请输入以下命令: 要对字符
𐐥
进行松散匹配搜索,其 Unicode 定义的代码点为 U+10425 ,十六进制表示为\U00010425
,请输入以下命令:要在 regex_test.txt 文件中搜索带有小数位的数字,请输入以下命令: 其中 "
Nd
是一个 Unicode 字符属性,用于包含小数位的数字。要在 regex_test.txt 文件中搜索日语平假名字符,请输入以下代码:
文件
项
|
描述
|
---|---|
/usr/bin/grep | 包含 grep 命令。 |