【Linux】grep命令(强大的文本搜索工具)

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退出

猜你喜欢

转载自blog.csdn.net/weixin_42170236/article/details/112579276