一、简介:
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常规用法
-c:显示匹配行的数量
-i:不区分大小写
-n:在输出符合要求的行的同时显示行号
-v:输出显示不符合要求的行,即反向选择
-r:会把目录下所有的文件全部遍历
--color=auto:把匹配到的关键词加上颜色显示
-A:后跟一个数字n,表示输出显示符合要求的行以及下面n行
-B:后跟一个数字n,表示输出显示符合要求的行以及上面n行
-C:后跟一个数字n,表示打印符合要求的行以及上下各n行
举例说明:
1、将/etc/passwd目录下,出现 root 的行取出来
# grep root /etc/passwd
或者 # cat /etc/passwd | grep root
2、过滤出带有“root”关键词的行并输出行号
grep -n ‘root' 1.txt
3、过滤出不带有“root”关键词的行并输出行号
grep -nv ‘root' 1.txt
4、将/etc/passwd,将没有出现 root 和nologin的行取出来
# grep -v root /etc/passwd | grep -v nologin
5、用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,在关键字所在行的前两行与后三行也一起捉出来显示
# dmesg | grep -n -A3 -B2 --color=auto 'eth'
另:在关键字的显示方面,grep 可以使用 --color=auto 来将关键字部分使用颜色显示。但是如果每次使用 grep 都得要自行加上 --color=auto 又很麻烦,可以使用 alias来处理。做法:在 ~/.bashrc 内加上这行:
alias grep='grep --color=auto'
再以source ~/.bashrc 来立即生效即可~这样每次运行 grep就会自动加上颜色显示。
6、根据文件内容递归查找目录
# grep ‘energywise’ * #在当前目录搜索带'energywise'行的文件
# grep -r ‘energywise’ * #在当前目录及其子目录下搜索'energywise'行的文件
# grep –l -r ‘energywise’ * #在当前目录及其子目录下搜索'energywise'行的文件,
但是不显示匹配的行,只显示匹配的文件
三、grep与正则表达式
. 表示除换行符之外的任意一个字符
* 表示重复0个或多个*前面的字符
+ 表示重复1个或多个+前面的字符
? 表示0个或1个?前面的字符
.* 表示任意个任意字符(包含空行)
[ ] 用于指定一个字符集,无论[ ]中有多少东西,只能匹配其中的一个字符。
注意:+和?grep不支持,egrep才支持。
1、字符集和单词
表示除换行符之外的任意一个字符。如 .at 会匹配出诸如cat、hat、bat等字符串。
当我们在一组集合字节中,如果该字节组是连续的,例如大写英文/小写英文/数字等,可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字串是数字与英文,就将他全部写在一起,变成:[a-zA-Z0-9]。[[a-zA-Z]代表所有的英文字母。
例如:
egrep ‘[a-z]at’ /usr/words
结果如:Akhmatova Alcatraz‘s Allstate……
如果只希望匹配一个单词,需要为它加上一对分隔符“\<”和“\>”
\<[a-z]at\>
结果如:bat bat‘s cat eat……
过滤两个或多个关键词
grep -E ‘123|abc‘ filename #找出文件中包含123或者abc的行
或者egrep ‘123|abc‘ filename
或者awk ‘/123|abc/‘ filename
egrep=grep -E
2、位置匹配
“^”匹配行首字符,“$” 匹配行尾字符。
例如:
过滤出以“the”开头的行,并显示行号
grep -n '^the' regular_express.txt
过滤掉/去除所有以#开头的行
grep -v ‘^#‘ 1.txt
过滤掉/去除所有空行和以#开头的行
grep -v ‘^$‘ 1.txt | grep -v ‘^#‘
过滤出以所有英文字母开头的行
grep ‘^[a-zA-Z]‘ 1.txt
过滤出以非数字开头的行
grep -v ‘^[0-9]‘ 1.txt 或者 grep ‘^[^0-9]‘ 1.txt
过滤出行尾结束为小数点 (.) 的那一行
grep -n '\.$' regular_express.txt
3、重复
元字符 |
描述 |
* |
重复0次或多次 |
+ |
重复一次或多次 |
? |
重复0次或多次 |
{n} |
重复n次 |
{n,} |
重复n次或多次 |
{n,m} |
重复不少于n次,不多于m次 |
例如:
匹配1个或者1个以上+前面的字符
egrep ‘o+‘ 1.txt
匹配0个或者1个?前面的字符
egrep ‘ao?‘ 1.txt
匹配roo或者匹配body
egrep ‘roo|body‘ 1.txt
用括号表示一个整体,匹配1个或者多个oo
egrep ‘(oo)+‘ 1.txt
过滤出“至少两个 o 以上的字串”时,就需要 ooo* ,即:
grep –n 'ooo*' regular_express.txt
如想要找出 g 开头与 g 结尾的行,当中的字符可有可无
grep -n 'g.*g' regular_express.txt
过滤出 g 后面接 2 到 5 个 o ,然后再接一个 g 的字串
grep -n 'go\{2,5\}g' regular_express.txt
注:笔者现在不想研究这个为什么grep后面的{},就加\转义,egrep就都没加,
目前搜到加转义是因为{}在shell中有特殊含义,而笔者也不知道什么事shell。
算了,以后有时间研究了再更新博客吧~
扩展grep(grep -E 或者 egrep):
使用扩展grep的主要好处是增加了额外的正则表达式元字符集。
过滤显示所有包含NW或EA的行。如果不是使用egrep,而是grep,将不会有结果查出。
# egrep 'NW|EA' testfile
对于标准grep,如果在扩展元字符前面加\,grep会自动启用扩展选项-E。
#grep 'NW\|EA' testfile
4、反义
是指除了某个字符外,其他什么都可以。例如,表示除了字母y的任何字符的正则表达式是:[^y]
注:匹配所有不以字母y开头的行: ^[^y]
5、字符转义
一些字符具有一些特殊含义,如“.”在正则表达式中表示“除了换行符之外的任意一个字符”,那想要表示“.”本身就需要用到转义字符“\”,它可以取消所有元字符的特殊含义。例如:“\.”匹配句点“.”,如果要匹配“\”,就用“\\”表示。
例如:下面的正则表达式匹配的是“www.baidu.com”: www\.baidu\.com
6、分支和子表达式(子表达式即分组)
分支:如:^ht$ 正则表示会执行“与”组合,表示所有以字母h开头,t结尾的行。
如果表示“或”组合的关系则使用“|”分隔。如匹配以字母h开头,或者t结尾的行:
^h|t$
子表达式:
如上例:用括号表示一个整体,匹配1个或者多个oo: egrep ‘(oo)+‘ 1.txt
又如:egrep “(or){2,}” /usr/words 匹配的是所有or重复2次或更多次的行。
如果:egrep “or{2,}” /usr/words 匹配的是字母o后面跟两个或更多字母r的行。