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 一起使用,来处理任意的文件名,即使是那些含有新行符的文件名。

浙公网安备 33010602011771号