一.相关介绍
(1)正则表达式:
正则表达式就是处理字符串的方法,它是以单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找,删除,替换某特定字符串的处理程序,正则表达式的作用就是让我们在编辑、处理文本文件的时候“飞起来”
注:书写正则表达式的时候,你要熟悉文件的内容。正则表达式的书写答案并不唯一;并且一个正则表达式并不适合所有的文件,有时是不可能一次就把答案写出来的,需要反复的修正。
(2) 文件类型
- 普通文件
d 目录文件
b 设备块文件
c 字符型文件
p 管道文件
(3)bash通配符
[:alnum:] 字母+数字
[:alpha:] 字母
[:lower:] 小写字母
[:upper:] 大写字母
[:digit:] 十进制数
[:punct:] 符号
[:space:] 空白字符(空格 “tab”)
[[:alnum:]] 任意的一个字母或数字[a-Z0-9]
[^[:alnum:]] 取反
取反[[:alnum:]!]
二.正则表达式+grep
1.元字符列表:
(1) ^ //行首定位符
(2)$ //行尾定位符
(3). // 任意的单个字符,但是换行符除外
(4)* //匹配0个或多个它的前一个字符
(5)[] //匹配[] 包含的一组字符中的一个
(6)\ //转义符,去掉特殊符号的意义
(7)\{m\} //前面的x出现m次
\{m,\} //前面的x出现 >= m 次
\{m,n\} //前面的x出现 m~n 次
(8)\(\) //标签
(9)\< //词首定位符
\> // \> 词尾定位符
注:以下截图有的为部分截图
例1. ^ 行首定位符
(1)[root@tx3 ~]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
(2)对结果就行取反(第三部分会对grep命令进行详细介绍)
[root@tx3 ~]# grep -v ^root /etc/passwd
图片1.jpg" src="http://img1.51cto.com/attachment/201305/125044334.jpg">
(3)列出行号
图片2.jpg" src="http://img1.51cto.com/attachment/201305/125102157.jpg">
例2. $行尾定位符
[root@tx3 ~]# grep bash$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
tx:x:500:500:tx:/home/tx:/bin/bash
例3. .意的单个字符,但是换行符出外
(1)r和t之间匹配两个字符
图片3.jpg" src="http://img1.51cto.com/attachment/201305/125152796.jpg">
例4. * 匹配0个或多个它的前一个字符
图片4.jpg" src="http://img1.51cto.com/attachment/201305/125205425.jpg">
注 .* 匹配所有
例5. [] 匹配[] 包含的一组字符中的一个
[abc] 中的一个
支持“-”的连字符
[0-9] 任意的数字
[a-z] 任意的小写字母
[A-Z] 任意的大写字母
[a-Z] 任意字母
[a-Z0-9] 任意的字母或数字
取反 [^ ]
[^0-9] 任意的非数字
[^a-z] 任意的非小写字母
[^A-Z]
[^a-Z]
[^a-Z0-9] 任意的符号
(1)找出uid是2位数的行:
图片5.jpg" src="http://img1.51cto.com/attachment/201305/125353338.jpg">
(2)匹配第1个字段是4个字符的行,两种方法
图片6.jpg" src="http://img1.51cto.com/attachment/201305/125408373.jpg">
例6. \ 转义字符:屏蔽元字符的含义
图片7.jpg" src="http://img1.51cto.com/attachment/201305/125425690.jpg">
例7. x\{m\} :前面的x出现m次
x\{m,\} :前面的x出现 >= m 次
x\{m,n\} :前面的x出现 m~n 次
(1)上面的匹配第1个字段是4个字符的行,用这种方法做
[root@tx3 ~]# grep "^[^:]\{4\}:" /etc/passwd
[root@tx3 ~]# grep "^[a-Z]\{4\}:" /etc/passwd
(2)
图片8.jpg" src="http://img1.51cto.com/attachment/201305/125646314.jpg">
例8. \(\)标签,保存包起来的字符,后面可以调用。最多能用9个
如何调用?-------->从左向右依次的顺序是1-9
\1 \2
[root@tx3 ~]# grep "root.*root.*root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@tx3 ~]# grep "\(root\).*\1.*\1" /etc/passwd
root:x:0:0:root:/root:/bin/bash
例9.\< 词首定位符 \> 词尾定位符
单词: 连续的字母或数字
图片9.jpg" src="http://img1.51cto.com/attachment/201305/125755165.jpg">
三. 扩展正则表达式
? //匹配前面的字符有0个或1个
+ //前面的字符有1个或多个
| //或
() //找出组字符串
()+ //多个组的判别
注:具体实例会结合egrep给出
四. grep家族(grep,egrep,fgrep)命令相关介绍
1. 在grep命令中输入字符串参数时,最好将其用双引号括起来。这样做有两个原因,一个是防止被误会是shell命令,二是可以用来查找多个单词组成的字符串
几个常用的选项:(为节省空间这里只粘取一行)
(1)-n 显示匹配行的行号
[root@tx3 ~]# grep -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
(2)-v 匹配内容取反
[root@tx3 ~]# grep -v "root" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
(3)-r 递归搜索
[root@tx3 ~]# grep -r "root" /etc/
[root@t1 123]# grep -hr "root" /etc
[root@tx3 ~]# grep -hr "root" /etc/
(6)-c 统计匹配的行数
[root@tx3 ~]# grep -c "root" /etc/passwd
2
(7)-i 匹配的内容不区分大小写
[root@tx3 ~]# grep -i "root" /etc/passwd
(8)显示匹配行以及它周围的行
-Anum after 下
-Bnum before 上
-Cnum 上下
图片10.jpg" src="http://img1.51cto.com/attachment/201305/125940303.jpg">
(9) -E 相当于egrep可以接扩展正则表达式
2. Egrep
egrep命令可以接扩展的正则表达式(可参照grep)
3. fgrep
fgrep命令是用来查找一个或多个与给出的字符串或词组相匹配文件中的行。fgrep 查询速度比grep命令快,但是不够灵活:它只能找固定的文本,它不识别正则表达式,是快速搜索命令。(参数可参照grep)
例1. ?匹配一个前面数字是2的(.需要转义)
图片11.jpg" src="http://img1.51cto.com/attachment/201305/130056636.jpg">
例2. + 前面的字符有1个或多个
图片12.jpg" src="http://img1.51cto.com/attachment/201305/130116996.jpg">
例3. | 或
图片13.jpg" src="http://img1.51cto.com/attachment/201305/130131505.jpg">
例4. ()找出组字符串
(1)
图片14.jpg" src="http://img1.51cto.com/attachment/201305/130145198.jpg">
(2)可以用{m}{m,}{m,n}匹配个数
图片15.jpg" src="http://img1.51cto.com/attachment/201305/130159871.jpg">
例5. 多个组的判别
图片16.jpg" src="http://img1.51cto.com/attachment/201305/130213818.jpg">
例6. fgrep不支持正则表达式
图片17.jpg" src="http://img1.51cto.com/attachment/201305/130226871.jpg">