1. 简介
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。Linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
2. 命令详解
2.1 格式
grep [option] pattern filename
2.2 可以使用–help查看用法
grep --help
2.3 常用命令
2.3.1 匹配模式选择
-E, --extended-regexp 扩展正则表达式egrep
-F, --fixed-strings 一个换行符分隔的字符串的集合fgrep
-G, --basic-regexp 基本正则
-P, --perl-regexp 调用的perl正则
-e, --regexp=PATTERN 后面根正则模式,默认无
-f, --file=FILE 从文件中获得匹配模式
-i, --ignore-case 不区分大小写
-w, --word-regexp 匹配整个单词
-x, --line-regexp 匹配整行
-z, --null-data 一个 0 字节的数据行,但不是空行
2.3.2 杂项
-s, --no-messages 不显示错误信息
-v, --invert-match 显示不匹配的行
-V, --version 显示版本号
--help 显示帮助信息
--mmap use memory-mapped input if possible
2.3.3 输入控制
-m, --max-count=NUM 匹配的最大数
-b, --byte-offset 打印匹配行前面打印该行所在的块号码。
-n, --line-number 显示的加上匹配所在的行号
--line-buffered 刷新输出每一行
-H, --with-filename 当搜索多个文件时,显示匹配文件名前缀
-h, --no-filename 当搜索多个文件时,不显示匹配文件名前缀
--label=LABEL print LABEL as filename for standard input
-o, --only-matching 只显示一行中匹配PATTERN 的部分
-q, --quiet, --silent 不显示任何东西
--binary-files=TYPE 假定二进制文件的TYPE 类型;
TYPE 可以是`binary', `text', 或`without-match'
-a, --text 匹配二进制的东西
-I 不匹配二进制的东西
-d, --directories=ACTION 目录操作,读取,递归,跳过
-D, --devices=ACTION 设置对设备,FIFO,管道的操作,读取,跳过
-R, -r, --recursive 递归调用
--include=PATTERN 只查找匹配FILE_PATTERN 的文件
--exclude=PATTERN 跳过匹配FILE_PATTERN 的文件和目录
--exclude-from=FILE 跳过所有除FILE 以外的文件
-L, --files-without-match 匹配多个文件时,显示不匹配的文件名
-l, --files-with-matches 匹配多个文件时,显示匹配的文件名
-c, --count 显示匹配的行数
-Z, --null 在FILE 文件最后打印空字符
2.3.4 文件控制
-B, --before-context=NUM 打印匹配本身以及前面的几个行由NUM控制
-A, --after-context=NUM 打印匹配本身以及随后的几个行由NUM控制
-C, --context=NUM 打印匹配本身以及随后,前面的几个行由NUM控制
-NUM 根-C的用法一样的
--color[=WHEN],
--colour[=WHEN] 使用标志高亮匹配字串;
-U, --binary 使用标志高亮匹配字串;
-u, --unix-byte-offsets 当CR 字符不存在,报告字节偏移(MSDOS 模式)
3. 用法举例
3.1 文件内容检索
搜索有the的行,并输出行号
$grep -n 'the' test.txt
搜 索没有the的行,并输出行号
$grep -nv 'the' test.txt
[]搜索集合字符
[] 表示其中的某一个字符 ,例如[ade] 表示a或d或e
$ grep -n 't[ae]st' test.txt
可匹配含有tast或者test的行
3.2 grep正则表达式元字符集
字符集 | 说明 | 案例 |
---|---|---|
^ | 锚定行的开始 | 如:’^grep’ 匹配所有以 grep 开头的行 |
$ | 锚定行的结束 | 如:‘grep$’ 匹配所有以 grep 结尾的行 |
. | 匹配一个非换行符的字符 | 如:‘gr.p’ 匹配 gr 后接一个任意字符,然后是 p |
* | 匹配零个或多个先前字符 | 如:’ grep’ 匹配所有一个或多个空格后紧跟 grep 的行。 . 一起用代表任意字符 |
[ ] | 匹配一个指定范围内的字符 | 如:’[Gg]rep’ 匹配 Grep 和 grep |
[^ ] | 匹配一个不在指定范围内的字符 | 如:’[^A-FH-Z]rep’ 匹配不包含 A-F 和 H-Z 的一个字母开头,紧跟 rep 的行 |
(…) | 标记匹配字符 | 如:’(love)’,love 被标记为1 |
< | 锚定单词的开始 | 如:’<grep’ 匹配包含以grep开头的单词的行 |
> | 锚定单词的结束 | |
x{m} | 连续重复字符 x,m 次 | 如:‘o{5}’ 匹配包含连续5个o的行 |
x{m,} | 连续重复字符 x,至少 m 次 | 如:‘o{5,}’ 匹配至少连续有5个 o 的行 |
x{m,n} | 连续重复字符 x,至少 m 次,不多于 n 次 | 如:‘o{5,10}’ 匹配连续 5-10 个 o 的行 |
\w | 匹配一个文字和数字字符也就是 [A-Za-z0-9] | 如:‘G\w*p’ 匹配以 G 后跟零个或多个文字或数字字符,然后是p |
\W | w 的反置形式,匹配一个非单词字符 | 如:点号句号等。\W* 则可匹配多个 |
\b | 单词锁定符 | 如: ‘\bgrep\b’ 只匹配 grep,即只能是 grep 这个单词,两边均为空格 |
3.3 查找指定进程
ps -ef | grep java
3.4 查找指定进程个数
ps -ef | grep -c java
# 或
ps -ef | grep java -c
3.5 文件中查找关键字,默认区分大小写,使用-i忽略大小写
grep 'TEST' test.txt # 默认区分大小写
grep -i 'TEST' test.txt # 忽略大小写
grep 'test' test1.txt test2.txt # 从多文件中查找
3.6 不包含关键字
grep -v 'test' test.txt
3.7 递归查找子文件
grep ‘test’ * #在当前目录搜索带'test'行的文件
grep -r ‘test’ * #在当前目录及其子目录下搜索'test'行的文件
3.8 列出关键字所在行的前几行与后几行也一起显示
# -A -B -C
# 很多时候,我们并关心匹配行而是关心匹配行的上下文。这时候-A -B -C就有用了
# -A n 后n行,A记忆为(After)
# -B n 前n行,B记忆为(Before)
# -C n 前n行,后n行,C记忆为(Center)
grep -A 10 "test" test.txt # 输出匹配test行以及后面10行的内容
3.9 同时过滤多个条件
grep "test1|test2" test.txt # 同时包含test1和test2
grep "test1" test.txt | grep "test2" # 同时包含test1和test2
grep -E "test1|test2" test.txt # test1或test2
grep -e test1 -e test2 test.txt # test1或test2
3.10 统计行数
# -c 不显示行内容,只显示几行
grep -c "test" test.txt
grep "test" test.txt | wc -l
3.11 匹配到第几行
grep -m 3 "test" test.txt # 匹配到第三个test退出