Linux grep 命令

Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。本文主要介绍Linux grep 命令。

 1、命令简介

grep:在Linux中,grep命令用于在文本文件中搜索指定的字符串或模式,并将匹配的行显示出来。grep是一个强大的文本搜索工具,常用于查找特定的内容或过滤文本。

2、命令语法

grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

3、命令描述

grep搜索指定的输入文件(如果没有文件命名,或者文件名只提供了一个连字符减号(-),则搜索标准输入,查找包含与给定模式匹配的行。默认情况下,grep打印匹配的行

4、命令选项

选项

描述

-A NUM,--after-context=NUM

在匹配行后打印NUM行的上下文。

在连续匹配组之间放置包含--的一行。

-a,--text

将二进制文件处理为文本;

这相当于--binary-files=text选项。

-B NUM,--before-context=NUM

在匹配行前打印NUM行的上下文。

在连续匹配组之间放置包含--的一行。

-C NUM,--context=NUM

打印NUM行的输出上下文。

在连续匹配组之间放置包含--的一行。

-b,--byte-offset

在输出的每一行之前打印输入文件中的字节偏移量。

--binary-files=TYPE

如果文件的前几个字节指示该文件包含二进制数据,

则假定该文件是TYPE类型。默认情况下,

TYPE是binary,grep通常输出一个单行消息,

表示二进制文件匹配,或者如果没有匹配则不输出消息。

如果TYPE是without-match,

则grep假定二进制文件不匹配;

这相当于-I选项。如果TYPE是text,

则grep将处理二进制文件,就好像它是文本;

这相当于-a选项。

警告:grep --binary-files=text可能会输出二进制垃圾,

如果输出是终端并且终端驱动程序将其中一些内容解释为命令,

可能会产生不良影响。

--colour[=WHEN],--color[=WHEN]

用GREP_COLOR环境变量中指定的标记包围匹配的字符串。

WHEN可以是‘never’、‘always’或‘auto’。

-c,--count

不输出正常结果;而是打印每个输入文件中匹配行的计数。

配合-v--invert-match选项(见下文),计算不匹配的行数。

-D ACTION,--devices=ACTION

如果输入文件是设备、FIFO或套接字,

则使用ACTION来处理。默认情况下,

ACTION是read,这意味着设备被读取,

就像它们是普通文件一样。如果ACTION是skip,

则设备将被静默跳过。

-d ACTION,--directories=ACTION

如果输入文件是目录,则使用ACTION来处理。

默认情况下,ACTION是read,这意味着目录被读取,

就像它们是普通文件一样。如果ACTION是skip,

则目录将被静默跳过。如果ACTION是recurse,

则grep递归地读取每个目录下的所有文件;这相当于-r选项。

-E,--extended-regexp

将PATTERN解释为扩展正则表达式(见下文)。

-e PATTERN,--regexp=PATTERN

使用PATTERN作为模式;有助于保护以-开头的模式。

-F,--fixed-strings

将PATTERN解释为由换行符分隔的固定字符串列表,

任何一个字符串都将被匹配。

-P,--perl-regexp

将PATTERN解释为Perl正则表达式。

-f FILE,--file=FILE

从FILE中获取模式,每行一个。

空文件包含零个模式,因此不匹配任何内容。

-G,--basic-regexp

将PATTERN解释为基本正则表达式(见下文)。

这是默认值。

-H,--with-filename

为每个匹配打印文件名。

-h,--no-filename

当搜索多个文件时,

不在输出中添加文件名前缀。

--help

输出简要的帮助消息。

-I

将二进制文件处理为不包含匹配数据的文件;

这相当于--binary-files=without-match选项。

-i,--ignore-case

在PATTERN和输入文件中忽略大小写区分。

-L,--files-without-match

不输出正常结果;而是打印每个未匹配输出的输入文件名。

扫描将在第一次匹配时停止。

-l,--files-with-matches

不输出正常结果;而是打印每个匹配输出的输入文件名。

扫描将在第一次匹配时停止。

-m NUM,--max-count=NUM

在匹配的行数达到NUM之后停止读取文件。

如果输入是来自常规文件的标准输入,

并且输出了NUM个匹配的行,

则grep确保在退出之前将标准输入定位到最后一个匹配行之后,

而不考虑尾随上下文行的存在。

这使得调用进程可以恢复搜索。

当grep在匹配的行数达到NUM之后停止时,

它会输出任何尾随的上下文行。

当同时使用-c--count选项时,

grep不会输出大于NUM的计数。

当同时使用-v--invert-match选项时,

grep在输出NUM个非匹配行后停止。

--mmap

如果可能,使用mmap(2)系统调用来读取输入,

而不是默认的read(2)系统调用。在某些情况下,

--mmap可以获得更好的性能。但是,

如果grep在操作时输入文件缩小,

或者发生I/O错误,--mmap可能导致未定义的行为(包括核心转储)。

-n,--line-number

在输出的每一行前面加上输入文件内的行号。

-o,--only-matching

仅显示与PATTERN匹配的匹配行的部分。

--label=LABEL

显示实际来自标准输入的输入作为来自文件LABEL的输入。

这对于像zgrep这样的工具特别有用,

例如,gzip -cd foo.gz | grep -H --label=foo something

--line-buffered

使用行缓冲,可能会导致性能下降。

-q,--quiet,--silent

安静模式;不向标准输出写入任何内容。

如果找到任何匹配,即使检测到错误,

也会立即退出,并返回零状态。

还参见-s--no-messages选项。

-R,-r,--recursive

递归地读取每个目录下的所有文件;这相当于-d recurse选项。

--include=PATTERN

仅在目录中递归搜索与PATTERN匹配的文件。

--exclude=PATTERN

在目录中递归搜索时跳过与PATTERN匹配的文件。

-s,--no-messages

不显示有关不存在或不可读文件的错误消息。

可移植性注意事项:与GNU grep不同,

传统grep不符合POSIX.2,

因为传统grep缺少一个-q选项,

其-s选项的行为类似于GNU grep的-q选项。

打算在传统grep中实现可移植性的shell脚本应避免使用-q-s,并

应将输出重定向到/dev/null

-U,--binary

将文件视为二进制文件。在MS-DOS和MS-Windows下,

默认情况下,

grep通过查看从文件读取的前32KB的内容来猜测文件类型。

如果grep判断文件是文本文件,

则从原始文件内容中删除CR字符

(以便正则表达式中的^和$能够正常工作)。

指定-U将覆盖此猜测,

导致所有文件都以原样读取并直接传递给匹配机制;

如果文件是文本文件,并且每行末尾都有CR/LF对,

那么某些正则表达式将失败。

此选项对于除MS-DOS和MS-Windows之外的平台无效。

-u,--unix-byte-offsets

报告Unix风格的字节偏移量。

此开关使grep报告字节偏移量,

就像文件是Unix风格的文本文件一样,

即去掉CR字符。

这将产生与在Unix机器上运行grep相同的结果。

除非使用-b选项,否则此选项无效;

对于除MS-DOS和MS-Windows之外的平台无效。

-V,--version

打印grep的版本号到标准错误。

此版本号应包含在所有错误报告中。

-v,--invert-match

反转匹配的意义,选择不匹配的行。

-w,--word-regexp

选择仅包含形成整个单词的匹配项的行。

测试是匹配的子字符串必须是行首,

或者是前面跟随非单词成分字符。类似地,

它必须是行尾或后面跟随非单词成分字符。

单词成分字符包括字母、数字和下划线。

-x,--line-regexp

选择与整行完全匹配的匹配项。

-y

-i的过时同义词。

-Z,--null

输出零字节(ASCII NUL字符),

而不是通常跟随文件名的字符。

例如,grep -lZ在每个文件名后输出一个零字节

,而不是通常的换行符。此选项使输出保持明确,

即使存在包含换行符等特殊字符的文件名。

此选项可与find -print0perl -0sort -z

xargs -0等命令一起使用,

以处理任意文件名,甚至包含换行符的文件名。

5、使用示例

1)在文件中搜索包含"cjavapy"的行,并显示行号

grep -n "cjavapy" file.txt

2)递归搜索目录下的所有文件,并查找包含"error"的行

grep -r "error" /path/to/directory

3)忽略大小写搜索文件中的"apple"

grep -i "https://www.cjavapy.com" urls.txt

4)显示不包含"world"的行

grep -v "world" file.txt

5)统计包含"success"的行数

grep -c "success" log.txt

注意:grep命令是区分大小写的,默认情况下不会递归搜索目录。

推荐阅读
cjavapy编程之路首页