grep命令详解

功能

打印匹配给定模式的行。

命令说明

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

grep搜索以FILE命名的文件输入(或者是标准输入或者给出的文件名是-)。寻找含有与给定模式PATTERN相匹配的内容的行。默认情况下,grep将把含有匹配内容的行打印出来。

options 参见下面的选项说明
PATTERN 就是你要匹配的内容,通过-e PATTERN 可以指定多个内容
-f FILE 从文件中读取正则表达式
[FILE...] 表示要搜索的文件或者目录,可以有多个

正则表达式

一个正则表达式是一个描述了一个字符串集合的模式。grep能理解两种不同版本的正则表达式 基本正则表达式和扩展正则表达式

正则表达式的语法

元字符

元字符 含义
^ 行首
$ 行尾
< 单词首
> 单词尾
\b 匹配词边缘的空字符串
? 先前的项是可选的,最多匹配一次
* 先前的项可以匹配零次或多次
+ 先前的项可以匹配一次或多次
先前的项将匹配恰好 n 次
先前的项可以匹配 n 或更多次
先前的项将匹配至少 n 词,但是不会超过 m 次。

方括号表达式

基本语法

方括号表达式是一个字符序列,放在[和]当中。它匹配序列中的任何一个字符;如果序列中的第一个字符是脱字符^,那么他匹配不在序列中的任何一个字符

[0123456789] // 匹配任何一个数字

范围表达式

由两个字符组成,中间使用-分隔。它匹配在这两个字符之间的任何一个字符[0-9]与[0123456789]等价

[0-9]

预定义字符类

预定义字符 含义
[:alpha:] 字母
[:digit:] 数字
[:alnum:] 字母和数字
[:lower:] 小写字母
[:upper:] 大写字母
[:print:] 可打印字符
[:space:] 空格
[:print:] 可打印字符

grep兄弟命令

egrep 可以处理用户扩展正则表达式
fgrep 值可以处理固定模式(只支持子串查找),处理速度最快
zgrep,zegrep、zfgrep与grep系列的相似,只是可以接受压缩文件gzip、compress

grep选项说明

-R, -r, --recursive

递归地读每一目录下的所有文件。这样做和 -d recurse 选项等价。

grep -r 'boy' dir

-i, --ignore-case

忽略模式 PATTERN 和输入文件中的大小写的分别。

grep -i 'boy' grep.txt

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

在匹配的行周围以 GREP_COLOR 环境变量中指定的记号来标记。WHEN 可
以是 never', always', 或是 `auto'。

grep --color=never -A 1 'boy' grep.txt

-H, --with-filename

为每个匹配打印文件名。

grep -H 'boy.*b[o]' grep.txt

-h, --no-filename

当搜索多个文件时,禁止在输出的前面加上文件名前缀。当不关心文件名,比如按时间分割的日志

grep -h 'boy.*b[o]' grep.txt

--include=PATTERN

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

grep --include='grep.txt' 'boy' /home/path/

--exclude=PATTERN

在目录中递归搜索,但是跳过匹配 PATTERN 的文件。

grep --exclude='log' 'boy' /home/path/

-A NUM --after-context=NUM

打印出紧随匹配的行之后的下文 NUM 行,在相邻匹配行之间会打印--的一行

grep -A 10 'boy' grep.txt

-a, --text

将一个二进制文件视为一个文本文件来处理;它与 --binary-files=text 选项等价。
一个文本文件在数据写入过程中可能会被认为是二进制文件,可以使用此选项来强制指定

grep -a 'boy' grep.txt

-B NUM, --before-context=NUM

打印出匹配的行之前的上文 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。

grep -B 10 'boy' grep.txt

-C NUM, --context=NUM

打印出匹配的行的上下文前后各 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。

grep -C 10 'boy' grep.txt

-b, --byte-offset

在输出的每行前面同时打印出当前行在输入文件中的字节偏移量。

grep -b 'boy' grep.txt

--binary-files=TYPE

如果一个文件的起始几个字节表明文件包含二进制数据,那么假定文件是 TYPE类型的。默认情况下, TYPE是 binary ,并且grep一般会输出一个一行的消息说一个二进制文件匹配,或者如果没有匹配的话就没有消息输出。如果类型 TYPE 是 without-match ,那么 grep 假定二进制文件不会匹配;这样做与 -I 选项等价。如果类型 TYPE 是 text,那么 grep 将一个二进制文件视为文本文件来处理;它与 -a 选项等价。
警告:
grep --binary-files=text可能会输出二进制的无用内容。如果输出设备是一个终端,并且终端的驱动将这些输出中的一些当作命令,可能会带来恶劣的副作用。

-c, --count

不输出匹配行,而是打印一个匹配的行的总数

grep -c 'boy' grep.txt

-v, --invert-match

改变匹配的意义,只选择不匹配的行

grep -c -v 'boy' grep.txt

-E, --extended-regexp

将模式 PATTERN 作为一个扩展的正则表达式来解释

grep -E 'boy' grep.txt

-e PATTERN, --regexp=PATTERN

指定模式搜索时使用的模式,最有用的是指定多个模式,或者模式以-开头的模式

grep  -e 'boy' -e 'a' grep.txt

-P, --perl-regexp

将模式 PATTERN 作为一个 Perl 正则表达式来解释。对于熟悉perl的人特别有用

-f FILE, --file=FILE

从文件 FILE 中获取模式,每行一个。空文件含有0个模式,因此不匹配任何东西。

grep -f pattern.txt grep.txt

-G, --basic-regexp

将模式 PATTERN 作为一个基本的正则表达式 (参见下面) 来解释。这是默认值。在基本正则表达式中,元字符 ?, +, {, |, (, 和 ) 丧失了它们的特殊意义;作为替代,使用加反斜杠的 (backslash) 版本 ?, +, {, |, (, 和 ) 。

-L, --files-without-match

打印没有匹配的文件的名字

grep -L 'boy' grep.txt

-l, --files-with-matches

打印有匹配的文件的名字

grep -l 'boy' grep.txt

-m NUM, --max-count=NUM

只查找NUM个匹配行

grep -m 1 'boy' grep.txt

-n, --line-number

在输出的每行前面加上它所在的文件中它的行号。

grep -n 'boy' grep.txt

-o, --only-matching

只显示匹配的行中与 PATTERN 相匹配的部分。

grep -o 'boy' grep.txt

-q, --quiet, --silent

安静。不向标准输出写任何东西。如果找到任何匹配的内容就立即以状态值 0 退出,即使检测到了错误。 参见 -s 或 --no-messages 选项。

grep -q 'boy' grep.txt
echo $?

-u, --unix-byte-offsets

报告 Unix 风格的字节偏移量。将文件作为 Unix 风格的文本文件看待,也就是说将 CR 字符去掉,必须与-b同时使用

grep -b -u 'boy' grep.txt

-x, --line-regexp

只选择能匹配完整一行的匹配。

grep -x 'boy' grep.txt
grep '^boy$' grep.txt // 与上面-x选项等价

-w, --word-regexp

只选择含有能组成完整的词的匹配的行。判断方法是匹配的子字符串必须是一行的开始,或者是在一个不可能是词的组成的字符之后。与此相似,它必须是一行的结束,或者是在一个不可能是词的组成的字符之前。词的组成字符是字母,数字,还有下划线。

grpe -w 'boy' grep.txt
grep '\<boy\>' grep.txt// 与上面-w选项等价

-Z, --null

输出一个全零字节 (ASCII 码中的 NUL 字符) 而不是一般情况下输出在文件名之后的字符。例如, grep -lZ在每个文件名之后输出一个全零字节而不是普通的新行符。这个选项使得输出清楚明白,即使文件名的表示中包含特殊字符比如新行符。这个选项可以与命令find -print0, perl -0, sort -z, 和 xargs -0 一起使用,来处理任意的文件名,即使是那些含有新行符的文件名。

posted @ 2022-07-03 21:49  我果然是个天才  阅读(418)  评论(0)    收藏  举报