每天一个 Linux 命令(13)—— grep

420 阅读8分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

命令简介

grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep 的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。grep 可用于 shell 脚本,因为 grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回 0 ,如果搜索不成功,则返回 1,如果搜索的文件不存在,则返回 2。我们利用这些返回值就可进行一些自动化的文本处理工作。

此外,grep 存在两个变体:egrep 和 fgrep 命令。egrep 命令相当于 grep -Efgrep 命令相当于 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 -print0perl -0sort -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 等命令一起配合使用,以处理任何类型的文件名。

应用实例

  1. 查找指定进程
ps -ef|grep python
  1. 查找指定进程个数
ps -ef|grep python -c
  1. 从文件中读取关键词进行搜索
cat file2.txt |grep -f file1.txt
  1. 从文件中读取关键词进行搜索 且显示行号
cat file2.txt | grep -nf file1.txt
  1. 从文件中查找关键词
grep 'linux' file1.txt
  1. 从多个文件中查找关键词
grep 'linux' file1.txt file2.txt
  1. grep 不显示本身进程
ps aux | grep ssh | grep -v "grep"
  1. 找出以 w 开头的行内容
cat file1.txt |grep ^w

参考文档

  • grep命令
  • 《Linux 常用命令简明手册》—— 邢国庆编著