这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
命令简介
grep
命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep
全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep
的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。grep
可用于 shell 脚本,因为 grep
通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回 0
,如果搜索不成功,则返回 1
,如果搜索的文件不存在,则返回 2
。我们利用这些返回值就可进行一些自动化的文本处理工作。
此外,grep
存在两个变体:egrep
和 fgrep
命令。egrep
命令相当于 grep -E
,fgrep
命令相当于 grep-F
。前者采用扩展的正则表达式解释匹配模式,后者按照匹配模式的字面意思即文字本身解释匹配模式。egrep
和 fgrep
将会逐渐隐退,需要时可用 grep
的相应选项代之。当然,系统通常还会提供,以便传统的应用能够不加修改地继续运行。
命令格式
grep [option] pattern file
命令参数
命令选项(匹配类型选择)
| -E,--extended-regexp
| 按照扩展的正则表达式解释指定的模式参数。运行 grep -E
相当于直接运行 egrep
命令。|
| -F,--fixed-strings
| 把模式参数看作一组字符串(而非模式),按照字符的文字本身检索匹配的数据。运行 grep -F
相当于直接运行 fgrep
命令。|
| -G,--basic-regexp
| 按照基本的正则表达式解释指定的模式参数(默认的选项)。|
| -P,--perl-regexp
| 按照 Perl 正则表达式解释指定的模式参数(尚未完全实现)。|
命令选项(匹配控制)
参数 | 解释 |
---|
-e pattern,--regexp=pattern | 使用指定的模式作为检索模式。利用这个选项可以指定多个检索模式,也可以指定首字符为连字符“-”的模式。 |
-f file,--file=file | 从指定的文件中读取模式,其中每行包含一个模式。如果模式文件为空,意味着包含零个模式,因而不匹配任何行。 |
-i,--ignore-case | 忽略模式参数或输入文件中模式的大小写字母差别。 |
-v,--invert-match | 反向匹配,即选择不匹配模式参数的数据行。 |
-w,--word-regexp | 仅选择匹配模式参数的字符串是一个完整字的数据行。一个字由大小写字母、数字和下画线组成。 |
-x,--line-regexp | 仅选择整行能够完全匹配模式参数的数据行。 |
命令选项(通用输出控制)
参数 | 解释 |
---|
-c,--count | 仅仅输出每个输入文件中匹配模式参数的数据行的数量,而不是输出匹配的数据行。当与 -v 选项一起使用时,仅输出不匹配的数据行的数量。 |
--color[=when],--colour[=when] | 围绕匹配的非空字符串、匹配的数据行、相关数据行、文件名、行号、字节偏移值以及字段与相关行组分隔符等,增加转义字符序列,以彩色(由 GREP_COLORS 环境变量定义)形式在终端屏幕上显示。when 的取值是 never (不加彩色)、always (总是增加彩色)或 auto (视终端而定)。 |
-l,--files-with-matches | 仅仅输出每个包含匹配数据的输入文件名。 |
-L,--files-without-match | 仅仅输出每个不包含匹配数据的输入文件名。 |
-m num,--max-count=num | 在发现指定数量的匹配数据行之后停止检索。如果输入数据来自普通的文本文件,grep 在输出指定数量的匹配数据行之后,终止运行之前将会记住最后一个匹配位置,当再次运行 grep 命令时能够从断点处恢复检索。当与 -v 选项一起使用时,在输出指定数量的不匹配数据行之后 grep 也会停止运行。 |
-o,--only-matching | 仅仅输出恰好匹配的部分(非空)。每个匹配部分分行输出。 |
-q,--quiet,--silent | 安静输出模式,即不输出任何信息,包括匹配的数据行和错误信息。检索结束或遇到错误后立即退出。如果发现任何匹配,返回结束状态 0,其他情况返回非零的结束状态。参见 -s 选项。 |
-s,--no-messages | 禁止输出错误信息,即使输入文件不存在或无法读取文件。但不禁止输出匹配的数据行,这一点与 -q 选项不同。 |
命令选项(输出数据行的前缀控制)
参数 | 解释 |
---|
-b,--byte-offset | 在输出的每一行之前,插入一个字节偏移值,表示含有匹配数据行的第一个字符在输入文件中的字节位置(从零开始编号)。如果同时指定了 -o 选项,则表示匹配字符串的第一个字符在输入文件中的字节位置。 |
-h,--no-filename | 禁止在输出的匹配数据行之前冠以文件名前缀。当仅检索一个输入文件时,这是默认的做法。 |
-H,--with-filename | 显示每个匹配数据行所在文件的名字。当同时检索多个输入文件时,这是默认的做法。 |
-n,--line-number | 在输出的每个匹配的数据行之前插入一个行号前缀。行号是数据行在输入文件中的逻辑行号,从 1 开始编号。 |
-T,--initial-tab | 确保数据行实际内容的第一个字符处于制表符位置。当使用 -H 、-n 或 -b 选项在数据行之前增加文件名、行号或字节偏移值前缀时,这个选项是非常有用的。 |
-Z,--null | 以 NULL 字符替代常规的文件名终止符(换行符)输出文件名。例如,grep-lZ 命令在输出文件名时使用 NULL 字符替代换行符作为文件名的终止符。这个选项可与 find -print0 、perl -0 、sort -z 和 xargs -0 等命令一起配合使用,以处理任何类型的文件名,即使其中包含换行符。 |
命令选项(相邻行控制)
参数 | 解释 |
---|
-A num,--after-context=num | 输出匹配的数据行之后,再输出其后面的数行数据。当存在多个匹配的数据行时,在每组数据行之间输出一个分隔符 -- 。与 -o 选项一起使用时,这个选项不起作用,而且会输出一条警告信息。 |
-B num,--before-context=num | 在输出匹配的数据行之前,先输出其前面的数行数据。当存在多个匹配的数据行时,在每组数据行之间输出一个分隔符 -- 。与 -o 选项一起使用时,这个选项不起作用,而且会输出一条警告信息。 |
-C num,-num,--context=num | 围绕匹配的数据行,输出其相邻的数行数据。当存在多个匹配的数据行时,在每组数据行之间输出一个分隔符 -- 。与 -o 选项一起使用时,这个选项不起作用,而且会输出一条警告信息。 |
命令选项(目录与文件选择)
参数 | 解释 |
---|
-d action,--directories=action | 如果输入文件参数是一个目录,按照 action 的要求进行处理。通常,action是 read ,意味着像读普通文件一样读取目录。如果 action 是 skip ,意味着不动声色地跳过即可。如果 action 是 recurse ,意味着递归地读取每个目录中的所有文件。相当于 -r 选项。 |
-D action,--devices=action | 如果输入文件参数是一个设备文件、管道文件或套接字,按照 action 的要求进行处理。通常,action 是 read ,意味着像读普通文件一样读取设备文件等。如果 action 是 skip ,意味着不动声色地跳过设备文件等即可。 |
--exclude=glob | 跳过其基本名字(不含目录部分)匹配指定通配符模式 glob 的文件。所谓的通配符模式指的是含有 * 、? 或 [...] 的文件名模式。 |
--exclude-dir=dir | 从递归检索中排除匹配指定的目录。 |
--exclude-from=file | 跳过其基本名字(不含目录部分)匹配指定文件 file 提供的任何通配符模式的文件。 |
--include=glob | 仅检索其基本名字(不含目录部分)匹配指定通配符模式 glob 的文件。 |
-R,-r,--recursive | 递归地读取每个目录中的所有文件。相当于 -d recurse 选项。 |
命令选项(其他选项)
参数 | 解释 |
---|
--mmap | 尽可能使用 mmap(2) 读取输入数据,而不是使用 read(2) 系统调用(默认)读数据,在某些情况下,--mmap 选项能够表现出较好的性能。 |
-z,--null-data | 用于检索行终止符为 NULL 字符而非换行符的数据文件。类似于 -Z 选项,这个选项可与 sort -z 等命令一起配合使用,以处理任何类型的文件名。 |
应用实例
- 查找指定进程
ps -ef|grep python
- 查找指定进程个数
ps -ef|grep python -c
- 从文件中读取关键词进行搜索
cat file2.txt |grep -f file1.txt
- 从文件中读取关键词进行搜索 且显示行号
cat file2.txt | grep -nf file1.txt
- 从文件中查找关键词
grep 'linux' file1.txt
- 从多个文件中查找关键词
grep 'linux' file1.txt file2.txt
- grep 不显示本身进程
ps aux | grep ssh | grep -v "grep"
- 找出以 w 开头的行内容
cat file1.txt |grep ^w
参考文档
- grep命令
- 《Linux 常用命令简明手册》—— 邢国庆编著