1. grep简介
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的功能。
egrep就等同于grep -E ,fgrep等同于grep -F 。
grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
-n: 输出行号
-i: 忽略大小写
-v: 反向搜索,显示不包含字符串的内容
-l: 查询多个文件,只输出包含匹配字符串的文件名称
-L: 查询不匹配的文件名
-c:只输出匹配行的计数。
二、grep使用 例子
#显示在aa,bb,cc文件中匹配test的行。
$ grep 'test' aa bb cc
#忽略大小写
more size.txt | grep -i 'b1..*3'
b124230
b103303
B103303
#显示/etc/passwd文件包含root的行内容,显示行好,不区分大小写
grep -ni Root /etc/passwd
#查询/etc/passwd文件中不包含root的行内容
grep -v root /etc/passwd
#显示所有以d开头的文件中包含 test的行。
[root@eccs_web_bak]#:grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
#单个字符匹配
more size.txt | grep 'b'
行匹配:输出匹配行的计数
grep -c "48" data.doc #输出文档中含有48字符的行数
3、根据条件搜索文件
#在当前目录搜索带root行的文件
grep 'root' *
#在当前目录及其子目录下搜索root的行文件
grep -r 'root' *
#在当前目录及其子目录下搜索root的行文件,但是不显示匹配的行,只是显示文件名称
grep -r -l 'root' *
4、正则表达式
[^]
匹配一个不在指定范围内的字符,如:\'[^A-FH-Z]rep\'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
(..)
标记匹配字符,如\'(love)\',love被标记为1。
x{m}
重复字符x,m次,如:\'0{5}\'匹配包含5个o的行。
x{m,}
重复字符x,至少m次,如:\'o{5,}\'匹配至少有5个o的行。
x{m,n}
重复字符x,至少m次,不多于n次,如:\'o{5,10}\'匹配5--10个o的行。
查询file_name文件中包含s与t字母之间包含三个字符的行
grep s...t file_name
查找文件file_name中包含“*”字符的行
grep \* filename
匹配包含单词“abc”的行,全词匹配
grep "\<abc\>" file_name
#显示包含test 或者 tast的行号的内容
grep -n 't[ae]st' /home/huangbiao.txt
#显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep '[a-z]\{5,\}' aa
#不匹配行首是48的行
grep '^[^48]' data.doc
备注:^在[]内代表【反向选择】,在[]外则代表定义在首部
#匹配正则表达式的开始行
grep '^root' /etc/group
root::0:root
#匹配root结束行
grep 'root$' /etc/group
root::0:root
mail::6:root
#找出空白行
grep -n '^$' /home/abc.txt
如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。
5、扩展grep(egrep 或者 grep -E)
egrep 'huang|liu' /home/test.text
=grep -e 'huang|liu' /home/test.text
=grep 'huang\|liu' /home/test.text