grep命令与基本正则表达式
Liunx上的文本处理三剑客:
grep、egrep、fgrep:文本过滤工具(模式:pattern)工具;
grep:支持基本正则表达式,-E支持扩展正则表达式,-F不支持正则表达式;
egrep:支持扩展正则表达式,-G支持基本正则表达式,-F不支持正则表达式;
fgrep:不支持正则表达式,-G支持基本正则表达式,-E支持扩展正则表达式;
sed:stream editor的简写,流编辑器;文本编辑器;
awk:Linux上实现叫做gawk,文本报告生成器(格式化文本);
正则表达式:由一类特殊字符及文本字符编写的模式,其中有些字符不表示字面意义,而是用于表示控制或通配的功能;
两类:1、基本正则表达式:BRE
2、扩展正则表达式:ERE
元字符:例如:\(hello[[:space:]]\+\)\+
grep命令:是用于全面搜索的正则表达式,并将结果输出。
作用:文本搜索工具,根据用户指定的 “模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式的元字符及文本字符所编写的过滤条件;
使用方式:
grep [选项] 模式 文件
grep [选项] [-e 模式 | -f 文件] [文件...]
常用选项:
--color=auto:对匹配到的文本做着色(加颜色)高亮显示,默认为红色;
-i:忽略大小写;
-o:仅显示匹配到字符串本身;
-v:显示不包含匹配文本的所有行;
-E:支持扩展的正则表达式;
-q:禁止输出任何结果,已退出状态表示搜索是否成功;
-A n(数字):显示匹配行及后n行;
-B n(数字):显示匹配行及前n行;
-C n(数字):显示匹配行及前后n行;
基本表达式的元字符:
1、字符匹配:
.:点号匹配任意单个字符;
[]:中括号匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符;
数字:[0-9] 或者 [[:dight:]];
所有小写字符:[[:lower:]];
所有大写字符:[[:upper:]];
所有字母(包括大小写): [[:alpha:]];
数字及字母: [[:alnum:]];
标点符号: [[:punct:]];
空白字符: [[:space:]];
2、匹配次数:用在要指定其出现次数的字符后面,用于限制其前面字符出现的字数;
*(星号):匹配前面字符任意次,0次、1次和多次;例如:匹配x*y;axy、ay、xxxxxy都符合匹配要求;
.*(点号星号):匹配任意长度的任意字符;
\?(反斜线问号):匹配其前面的字符0次或1次;即前面的字符可有可无;
\+(反斜线加号):匹配其前面的字符1次或多次;即前面的字符要出现至少1次;
\{m\}(m代表数字):匹配前面字符m次;
\{m,n\}(m,n代表数字):匹配前面字符至少m次,最多n次;
\{0,n\}:匹配前面字符最多n次;
\{m,\}:匹配前面字符至少m次;
3、位置锚定:
^:行首锚定,用于模式的最左侧;例如:^root;
$:行尾锚定,用于模式的最右侧;例如:root$;
^PATTERN$:用PATTERN匹配整行;例如:^root$;
^$:匹配空白行(不包括任意字符包括空白字符);
^[[:space:]]*$:匹配空白行或包括空白字符的行;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
\< 或 \b:单词词首锚定,用于单词的左侧;例如:\<root;
\> 或 \b:单词词尾锚定,用于单词的右侧;例如:root\>;
\<单词\>:精确锚定单词,匹配完整单词;例如:\<root\>;
练习:1、显示/etc/passwd文件中不以/bin/bash结尾的行;
语句:~]# grep -v "/bin/bash$" /etc/passwd;
2、显示/etc/passwd文件中两位数或三位数;
语句:~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后非空白字符的行;
语句:~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg;
4、找出“netstat -tan”命令的结果中以“LISTEN”后跟0、1或多个空白字符结尾的行;
语句:~]# netstat -tan | grep "LISTEN[[:space:]]*$";
4、分组及引用:
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;例如:\(xy\)*,匹配xy字符0次,1次或多次;
Note:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
\1:模式从左侧其,从第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2:模式从左侧其,从第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\3:模式从左侧其,从第三个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
后向引用:引用前面的分组中的模式所匹配的字符;
例如:
He likes his lover.
He loves his lover.
She likes her liker.
She loves her liker.
查找第一个l..e与第二个l..e一致的语句
语句:grep "\(l..e\).*\1"
结果:He loves his lover.
She likes her liker.