grep、egrep和正则表达式的总结
一、grep的使用
1.grep的解释
grep为global search regularexpression(RE) and print out the line的缩写,即根据用户指定的文本搜索模式对目标文件进行搜索并显示能够被模式匹配到的行的一种文本搜索工具。
2.grep的使用格式
gerp [options]'PATTERN'file,....
其中PATTERN项需要使用''或者"",如果需要对模式进行转换,则需要使用"",如果不需要进行转换,则使用''或""都可以。模式还可以使用正则表达式来表示。
3.grep的常用选项
--color:用来指定被模式匹配到的字符的显示颜色,参数选项有never,always和auto
-v:反向匹配,即不能被模式所匹配到的行,也可以使用--invert-match长选项
-o:只显示被模式匹配到字符串,而非显示整行(grep默认显示被匹配到的整行)
-i:不区分大小写,也可以使用--ignore-case长选项
-E:支持扩展的正则表达式,相当于egrep
-A:与数字一起使用,显示被模式匹配到的行并且显示被匹配到的行的下面多少行
-B: 与数字一起使用,显示被模式匹配到的行并且显示被匹配到的行的上面多少行
-C: 与数字一起使用,显示被模式匹配到的行并且显示被匹配到的行的上下各显示多少行
4.正则表达式的字符合集:
.:表示匹配任意一个字符 | [ ]:匹配指定范围内的单个字符 |
[^]:匹配指定范围外的单个字符,也可使使用选项v来完成 | [[:space:]]:表示空白字符 |
[[:lower:]]:表示所有小写字母 | [[:upper:]]:表示所有大写字母 |
[[:aplha:]]:表示所有字母,也可使用[a-z]表示 | [[:digit:]]:表示所有的数字,也可以使用[0-9]表示 |
[[:almun:]]:表示所有的数字和字母 | [[:punct:]]:表示所有特殊字符 |
5.次数匹配:用来指定匹配其前面字符出现的次数,只能匹配模式紧靠着的一个字符
*:出现任意次
.*: 出现任意次的任意字符
\?: 出现0次或者1次
\{m\}: 表示出现m次
\{m,n\}: 表示至少出现m次,至多出现n次
\{m,\}: 表示最少出现m次
\{0,n\}:表示至多出现n次,其中0不能省略
案例:显示/etc/passwd中r后面出现最少一次,最多2次的
1 2 3 4 | [root@localhost ~]# grep "ro\{1,2\}" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin |
6.位置锚定
位置锚定:
^:行首锚定:
写在模式最左侧
$:行尾锚定:
写在模式最右侧
^$:
空白行
不包含特殊字符的连续字符组成的串叫单词
\<:词首,出现在单词左侧
\>:词尾,出现在单词右侧
\b:出现在词首,词尾都可以
7.分组
\(\)
例如:\(ab\)*表示ab可以出现任意次(包括0次)
8.引用:对分组的字符串基于位置引用
\1: 后向引用,表示引用前面的第一个左括号与之对应的右括号中的模式所匹配到的内容
\2: 表示引用前面的第二个左括号与之对应的右括号中的模式所匹配到的内容
...
二、egrep的使用
基本等同于grep的使用:
1.字符
.:表示匹配任意一个字符 | [ ]:匹配指定范围内的单个字符 |
[^]:匹配指定范围外的单个字符,也可使使用选项v来完成 | [[:space:]]:表示空白字符 |
[[:lower:]]:表示所有小写字母 | [[:upper:]]:表示所有大写字母 |
[[:aplha:]]:表示所有字母,也可使用[a-z]表示 | [[:digit:]]:表示所有的数字,也可以使用[0-9]表示 |
[[:almun:]]:表示所有的数字和字母 | [[:punct:]]:表示所有特殊字符 |
2.次数匹配:用来指定匹配其前面字符出现的次数,只能匹配模式紧靠着的一个字符
*:出现任意次
.*: 出现任意次的任意字符
?: 出现0次或者1次
+: 至少出现1次
{m}: 表示出现m次
{m,n}: 表示至少出现m次,至多出现n次
{m,}: 表示最少出现m次
{0,n}:表示至多出现n次,其中0不能省略
3.位置锚定符:用于来指定字符出现的位置
^:用于锚定行首,用法为^Char
$:用于锚定行尾,用法为Char$
^$:用来表示空白行
4.单词的锚定:所有非自然的单词
\<:用于锚定单词的词首,也可以使用\b表示,用法为\<Char或\bChar
\>:用于锚定单词的行尾,也可以使用\b表示,用法为Char\>或Char\b
5.分组:对模式进行分组
\(\)
6.引用:对分组的字符串基于位置引用
\1: 后向引用,表示引用前面的第一个左括号与之对应的右括号中的模式所匹配到的内容
\2: 表示引用前面的第二个左括号与之对应的右括号中的模式所匹配到的内容
egrep相当于grep –E。
以下是一些课堂练习:
1、显示/proc/meminfo文件中以大小写s开头的行;
# grep "^[sS]"/proc/meminfo
# grep -i "^s"/proc/meminfo
2、取出默认shell为非bash的用户;
# grep -v "bash$"/etc/passwd | cut -d: -f1
3、取出默认shell为bash的且其ID号最大的用户;
# grep "bash$"/etc/passwd | sort -n -t: -k3 | tail -1 | cut -d: -f1
4、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# grep"^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# grep"^[[:space:]]\{1,\}[^[:space:]]\{1,\}" /boot/grub/grub.conf
6、找出/etc/passwd文件中一位数或两位数;
# grep --color=auto"\<[0-9]\{1,2\}\>" /etc/passwd
7、查看当前系统上root用户的所有信息;
# grep "^root\>"/etc/passwd
8、添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户;
# grep --color=auto"^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd