1、 简介linux
grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。 正则表达式
grep的工做方式是这样的,它在一个或多个文件中搜索字符串模板。若是模板包括空格,则必须被引用,模板后的全部字符串被看做文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep可用于shell脚本,由于grep经过返回一个状态值来讲明搜索的状态,若是模板搜索成功,则返回0,若是搜索不成功,则返回1,若是搜索的文件不存在,则返回2。咱们利用这些返回值就可进行一些自动化的文本处理工做。
Grep命令中容许指定的串语句是一个规则表达式,这是一种容许使用某些特殊键盘字符的指定字符串的方法,这种方法中的特殊键盘字符能够用于表明其余字符也能够进一步定义模式匹配工做方式。例如:grep ".*hood" essay1。该命令将在文件essay1中搜索,显示出包含带有字符串hood的字的每一行。命令行中的点表示的是hood以前能够有任意字符,星号指的是在字符串以前点号所表示的任意字符能够有任意个(其中的双引号是无关紧要的,可是当语句中包含短语或者空格时就必须加双引号)[1]
2、用法
(1)
表达符集
一、^ 锚定行的开始 ,如'^google'匹配因此以google开头的行
二、$ 锚定行的结束, 如'goolge$'匹配因此以google结束的行
三、. 匹配一个非换行符('\n')字符, 如‘gr.p'匹配gr后接一个任意字符
四、* 匹配零个或多个先前字符
五、[] 匹配一个指定范围内的字符,如'[Gg]rep' 匹配Grep和grep
六、[^] 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。
七、\< 锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
八、\> 锚定单词的结束,如'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。
1三、\W \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
1四、\b 单词锁定符,如: '\bgrep\b'只匹配grep。[2]
1五、\+ 匹配一个或多个先前的
字符。如:'[a-z]\+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
1六、\? 匹配零个或一个先前的字符。如:'gr\?p'匹配gr后跟一个或没有字符,而后是p的行。
1七、a\|b\|c 匹配a或b或c。如:grep|sed匹配grep或sed
1八、\(\) 分组符号,如:love\(ab\le\|rs\)ov\+匹配loveable或lovers,匹配一个或多个ov。
(2)命令选项shell
一、-? 同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。
二、-a, --text 等价于匹配text,用于(Binary file (standard input) matches)报错
三、-b,--byte-offset 打印匹配行前面打印该行所在的块号码。
四、-c,--count 只打印匹配的行数,不显示匹配的内容。
五、-f File,--file=File 从文件中提取模板。空文件中包含0个模板,因此什么都不匹配。
六、-h,--no-filename 当搜索多个文件时,不显示匹配文件名前缀。
七、-i,--ignore-case 忽略大小写差异。
八、-o, --only-matching 只显示正则表达式匹配的部分。(show only the part of a line matching PATTERN)
九、-q,--quiet 取消显示,只返回退出状态。0则表示找到了匹配的行。
十、-l,--files-with-matches 打印匹配模板的文件清单。
十一、-L,--files-without-match 打印不匹配模板的文件清单。
十二、-n,--line-number 在匹配的行前面打印行号。
1三、-s,--silent 不显示关于不存在或者没法读取文件的错误信息。
1四、-v,--revert-match 反检索,只显示不匹配的行。
1五、-w,--word-regexp 若是被\<和\>引用,就把
表达式作为一个单词搜索。
1六、-R, -r, --recursive 递归的读取目录下的全部文件,包括子目录。 好比
grep -R 'pattern' test会在 test 及其子目录下的全部文件中,匹配 pattern。
1七、-V,--version 显示软件版本信息。
1八、-A6 查找某些字符的内容,并下延伸6行
1九、-B6 查找某些字符的内容,并上延伸2行
20、-C1 查找某些字符的内容,并上和向下各延伸1行
这几行后面的数字直接影响延伸数量,并以--符号分割搜索行的结果
3、实例
一、$ ls -l | grep '^a' 经过管道过滤ls -l输出的内容,只显示以a开头的行。
二、$ grep 'test' d* 显示全部以d开头的文件中包含test的行。
三、$ grep 'test' aa bb cc 显示在aa,bb,
cc文件中匹配test的行。
四、$ grep '[a-z]\{5\}' aa 显示全部包含每一个
字符串有5个连续小写字符的字符串的行。
五、$ grep 'w\(es\)t.*\1' aa 若是west被匹配,则es就被存储到内存中,并标记为1,而后搜索任意个字符(.*),这些字符后面紧跟着另一个es(\1),找到就显示该行。若是用egrep或grep -E,就不用"\"号进行转义,直接写成'w(es)t.*\1'就能够了。
六、 ps -ef|grep clustal2 查找指定进程“clustal2”
ps -ef|grep clustal2|wc -l 查找指定进程“clustal2”的运行个数
ps -ef|grep clustal2
longpen+ 27347 26704 0 11:13 pts/5 00:00:00 grep --color=auto clustal2
ps -ef|grep clustal2|wc -l
1ubuntu
七、cat test.txt | grep -f test2.txt工具
[root@localhost test]# cat test.txt
hnlinux
peida.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root@localhost test]# cat test2.txt
linux
Redhat
[root@localhost test]# cat test.txt | grep -f test2.txt
hnlinux
ubuntu linux
Redhat
linuxmint
[root@localhost test]#
八、cat test.txt |grep -E "ed|at" 显示包含ed或者at字符的内容行ui
九、grep '[a-z]\{7\}' *.txt 显示当前目录下面以.txt 结尾的文件中的全部包含每一个字符串至少有7个连续小写字符的字符串的行
注、一、在正则表达式中,注意转义字符的使用。如
grep "$a" file #引用变量a,查找变量a的值
grep '$a' file #查找“$a”字符串
grep '\\' file #查找‘\’字符
grep "\\\\" file # 因为是双引号,shell先把\\转义,就成了\,grep接收到的只有\\\,\是特殊字符 ,后面应该跟须要转义的字符,也就是\\,因此若是直接使用"//"那么就出现了错误。
[1] 来自百度百科 google