一、grep的基本用法
????????grep是一个常见的文本选取工具,它可以将一段数据分析后,取出我们想要的,或者是经由关键字、正则表达式匹配选出我们想要的那一行。grep的用法及选项如下所示:
grep:文本过滤工具
用法1:grep [OPTIONS] PATTERN [FILE...]
用法2:grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
-v:取反,显示文本中没有被PATTERN匹配上的所有行
-i:匹配是忽略字符大小写
-n:匹配出的行显示行号
-c:只显示被匹配到的内容的行数
-o:只显示行中被模式匹配到的字符串
-q:静默模式,不输出结果,只返回匹配结果,常用于shell编程
-e:实现多个选项的逻辑或关系,即or关系
-A NUM:显示匹配到的行及其后NUM行
-B NUM:显示匹配到的行及其前NUM行
-C NUM:显示匹配到的行及其前后各NUM行
-w:匹配整个单词
-E:开启扩展正则表达式
-f:以前一个文件的内容作为模板,找出后面文件和前面文件的交集
-F:相当于fgrep,不支持正则表达式,速度更快
二、基本正则表达式的语法
????????基本正则表达式大致可分为五类字符,包括:
- 1、元字符
- . :匹配除换行符之外的任意单个字符,与通配符的?类似
注意:如果需要在正则中表示".",那么可以用\或者[.]
- [] :匹配指定范围内的单个字符
- [^] :陪陪指定范围外的单个字符
- [:space:] :数字0-9
- [:punct:] :标点符号集合
- [:lower:] :小写字母
- [:upper:] :大写字母
- [:alpha:] :大小写字母
- [:digit:] :数字
- [:alnum:] :数字+大小写字母
- 2、次数匹配字符
- * :匹配其前面的字符任意次(0-n)
常见用法 :".*"表示任意长度的任意字符
- \? :匹配其前面的字符0次或1次
- \+ :匹配其前面的字符至少1次
- \{n\} :匹配其前面的字符n次
- \{n,\} :匹配其前面的字符至少n次
- \{,m\} :匹配其前面的字符至多m次
- \{n,m\} :匹配其前面的字符至少n次,至多m次
- 3、位置锚定字符
- ^ :行首锚定
- $ :行尾锚定
- \<或\b :单词首部锚定
- \>或\b : 单词尾部锚定
特殊用法:
"^$" :表示匹配空行(不是空白行)
"^[[:space:]]*$" :表示匹配空白行
- 4、分组
- \(ab\) : 将括号内的字符作为一组,其后可以使用\\1、\\2、\\3来对前面的分组进行引用:
- \1 :对前面第一个分组进行引用
- \2 :对前面第二个分组进行引用
- \3 :对前面第三个分组进行引用
当然在分组后面也可以使用次数匹配字符对分组中的字符或字符串进行次数匹配
- 5、或者
- a \| b:表示a或者b
- C \| cat:C或者cat
注:这里或关系表示的"|"两边的单词而不是字符
- (C\|c)at:Cat或者cat
注:向表示两边的字符得把字符用()括起来
三、扩展正则表达式
????????事实上,我们只要了解了基本正则表达式就够用了,但某些时候,我们为了简化命令操作,使用扩展正则表达式会更方便呢!
????????扩展正则表达式和基本正则表达式没有很大区别,扩展正则表达式为方便阅读,取消了大部分字符需要的转译操作,下面我们来看一看扩展正则的基本用法:
- 1、元字符
- 与基本正则表达式没有任何区别
- 2、次数匹配字符
- * :匹配其前面的字符任意次(0-n)
- ? :匹配其前面的字符
- + :匹配其前面的字符至少一次
- {n} :匹配其前面的字符n次
- {n,} :匹配其前面的字符至少n次
- {,m} :匹配其前面的字符至多m次
- {n,m} :匹配其前面的字符至少n次,至多m次
- 3、位置锚定字符
- ^ :行首锚定
- $ :行尾锚定
- \<或\b :单词首部锚定
- \>或\b : 单词尾部锚定
- 4、分组
- (ab) : 将括号内的字符作为一组,其后可以使用\\1、\\2、\\3来对前面的分组进行引用:
- \1 :对前面第一个分组进行引用
- \2 :对前面第二个分组进行引用
- \3 :对前面第三个分组进行引用
当然在分组后面也可以使用次数匹配字符对分组中的字符或字符串进行次数匹配
- 5、或者
- a | b:表示a或者b
- C | cat:C或者cat
- (C | c)at:Cat或者cat
四、grep的用法及常用选项演示
????????下面我将以/app/passwd文件来演示grep一些常见选项的用法。/app/passwd文件内容如下所示:
1、-v选项是用来显示未被模式匹配到的内容的选项,我们使用grep "root" /app/passwd命令来筛选除文件中包含root的行,结果如下所示:
但是使用-v选项之后,在看结果,就是显示未被模式匹配到的行了:
2、如果不加-i选项,模式中的内容默认是区分大小写的,所以如果我们使用grep "Root" /app/passwd命令应该是匹配不到任何内容的,如果加上-i选项,可以使模式中的内容不再区分大小写,结果展示如下:
3、-n就是显示被匹配大的内容在文中的行号,演示如下:
4、使用-c选项即用来显示被匹配到内容的行数,所以我们使用grep -c "root" /app/passwd命令应该只会显示出1,演示如下:
5、使用-o选项可以起到只显示被模式匹配到的字符串的效果,而不是去显示被模式匹配到的字符串所属的哪一行,使用与不适用-o选项的效果分别如下:
6、-q为开启静默模式,即使模式能匹配到内容,也不显示输出结果,常用于shell编程,作为判断条件使用,在此不做演示
7、-A|B|C效果类似,即不单单显示被匹配上的行,还显示其周边的行,在此以-A为例进行演示:
8、-w为匹配整个单词,即"root"这种模式在不加-w这种情况下,不仅会把含root的行筛选出,也会把含有rooter的行筛选出来:
9、-E为开启扩展正则表达式,即PATTERN中的语法为扩展正则的语法
10-f以前一个文件为模板,匹配出后面文件与之相同的行,演示如下:
五、grep集合正则表达式的一些常见用法
????????<font size=3>介绍完grep的基本用法之后,我们来看以看grep和正则结合起来的一些常见用法:</font>
1、显示/proc/meminfo文件中以大小写s开头的行
# grep "^[sS]" /proc/meminfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行
# grep -v "/bin/bash$" /etc/passwd
3、如果root用户存在,显示其默认的shell程序
# grep "^root\>" /etc/passwd | cut -d: -f7
4、找出/etc/passwd中的两位或三位数
# grep -owE "([1-9][0-9])|([1-9][0-9][0-9])" /etc/passwd
5、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行
# grep "^[[:space:]][^[:space:]]+" /etc/rc.d/rc/sysinit
6、找出"netstat -tan"命令的结果中以"LISTEN"后跟0、1或多个空白字符结尾的行
# netstat -tan | grep -E "LISTEN([0|1])|([[:space:]])"
7、显示当前系统root、centos或user1用户的默认shell和UID
# grep -owE "^root|centos|user1" | cut -d: -f1,3,7
8、找出/etc/rc.d/init.d/functions文件(centos6和7)中某单词后面跟一个小括号的行,也即使是找出函数名
# grep -oEw "[[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
9、使用echo输出一绝对路径,使用egrep取出其基名
# echo "/etc/init.d/" | grep -owE "[^/]+/?$" | cut -d "/" -f1
10、使用echo输出一绝对路径,使用egrep取出其路径名
# echo "/etc/init.d/init/suibian/dage" | grep -oE "^/[^/]+.*[^/]" | grep -oE "^/[^/]+.*/"
11、找出ifconfig命令中1-255之间的数值
# grep -owE "\<(([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))\>"
12、找出ifconfig命令中的IP地址
# ifconfig | grep -owE "((\<([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])\>)[.]){3}(\<([0-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])\>)"
原文地址:http://blog.51cto.com/13547664/2154999