grep正则表达式详解及练习
一、在学习grep正则表达式前,先了解下linux著名的文本处理三剑客:
(1)grep、egrep、fgrep 文本搜索工具。
(2)sed 文本编辑工具,一种流编辑器,行编辑工具。
(3)awk 强大的文本分析工具,文本格式化工具,文本报告生成器。
以上三大命令均支持正则表达式,本文以grep正则表达式为例展开学习。
1、什么是正则表达式?
正则表达式(Regular Expression):由一类特殊字符及文本字符所编写的模式,其有些字符不表示其字面意义,而是用于表示控制或通配的功能。正则表达式只是字符串的一种描述(一种表示法),只有和支持正则表达式的工具相结合才能进行字符串处理。
2、正则表达式的构成:
正则表达式由两种字符构成。一种是在正则表达式中具体特殊意义的“元字符”,另一种是普通的“文本字符”。元字符可以是一个字符,如“^”,也可以是一个字符序列,如“\b”。
3、主要分为两类:(1)基本正则表达式(BRE)
(2)扩展正则表达式(ERE)
二、本文以grep为例来讲解正则表达式
1、grep家族有三大成员分别为:
grep:支持使用基本正则表达式。
egrep:支持使用扩展正则表达式。
fgrep:不支持使用正则表达式。
2、grep命令:
功能:根据用户指定的”pattern(过滤条件)“对目标文本逐行进行匹配检查;打印出符合条件的行,即文本搜索工具。注:PATTERN即过滤条件指由文本字符及正则表达式元字符所编写的字符串。
常用选项一:
--color=auto,每次grep搜索之后,自动高亮显示所匹配字符。
CentOS7定义了grep别名alias grep=’grep--color=auto’
-i:忽略字符大小写
-o:仅输出文件中匹配到的部分
-v:反向查找,输出文件中不匹配的行。
-q:进入静默模式,该模式下,grep命令运行目的仅仅是执行一个条件测试,通常在脚本中使用,通过检查其返回值进行下一步操作。
常用选项二:
-E:支持使用扩展正则表达式,相当于egrep;
-F:支持使用固定字符串,不支持正则表达式,相当于fgrep;
-G:支持使用基本正则表达式;
-P:支持使用pcre正则表达式;
-A:显示匹配字符串及后n行的数据
-B:显示匹配字符串及前n行的数据
-C: 显示匹配字符串及前后各n行的数据
-e:多模式机制;
-f:FILE为每行包含了一个pattern的文本文件,即grep script;
-n:在行首显示行号
3、基本正则表达式元字符:
(1)字符匹配:
.:匹配任意单个字符
[ ]:匹配范围内的任意单个字符 [abc]表示“a”或“b”或“c”
[^ ]:匹配范围外的任意单个字符 [^abc]表示除了“a”、“b”、“c”外的其他任意字符。
(2)匹配次数: 用在要指定其出现的次数的字符后面,限制其前面字符出现的次数,默认工作在贪婪模式。
*: 匹配前面的字符任意次(0、1、或多次),相当于\{0,\};
.*:任意长度的任意字符;
\+:匹配前面的字符至少1次,相当于\{1,\};
\?:匹配前面的字符0次或者1次,即前面的字符可有可无;
\{m\}:其前面的字符出现m次,m为非负整数;
\{m,n\}:其前面字符出现最少m次最多n次,\{m,\}最少m次,\{o,n\}最多n次;
(3)位置锚定:限制使用搜索模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的那个位置
^: 行首锚定;用于模式的最左侧,^PATTERN , ^hello搜寻以hello开头的行。
$: 行尾锚定;用于模式的最右侧,PATTERN$ , hello$搜寻以hello结束的行。
^PATTERN$: 让PATTERN完全匹配一整行, ^how are you$搜索内容为”how are you”的行。
^$ :搜寻内没有任何字符的行(包括空白字符),空行
^[[:space:]]*$ :空行或仅有空白字符的行;
(4)单词锚定: Linux中的单词指:由非特殊字符组成的连续字符(字符串)。
\<或\b: 词首锚定,用于单词模式的左侧,\<PATTREN或\bPATTERN
\>或\b: 词尾锚定,用于单词模式的右侧,PATTERN\>或PATTREN\b
\<PATTERN\>:单词锚定
(5)分组与引用:
\(PATTERN\):将此PATTERN匹配到的字符作为一个不可分割的整体进行处理;分组匹配到的内容会被正则表达式引擎自动记录到内部变量中,这些变量是\1,\2,\3,…
pat1\(pat\2)pat3\(pat4\(pat5\)pat\)
\1:第一组括号中的pattern匹配到的字符串,从左侧起,第一个左括号及与之匹配的右括号内模式匹配到的内容。
\2:第二组括号中的pattern匹配到的字符串,从左侧起,第二个左括号及与之匹配的右括号内模式匹配到的内容。
后向引用:引用前面括号中的模式所匹配到的字符
输出结果中行首字符跟行尾字符相同(行尾引用了行首匹配到内容)。
4、egrep命令:
支持使用扩展正则表达式的grep命令,相当于grep -E,其常用选项基本同grep命令,可参考上文。
5、扩展正则表达式元字符:
扩展正则表达式就是在基本正则表达式的基础上,增加了一些元字符,而且有部分参数是不需要添加\转义符使用的。
(1)字符匹配:
.:匹配任意单个字符
[ ]:匹配范围内的任意单个字符
[^ ]:匹配范围外的任意单个字符
(2)匹配次数:
*: 匹配前面的字符任意次(0、1、或多次);
.*: 任意长度的任意字符;
+: 匹配前面的字符至少1次
?: 匹配前面的字符0次或者1次,即前面的字符可有可无;
{m}:其前面的字符出现m次,m为非负整数;
{m,n}: 其前面字符出现最少m次最多n次,{m,}最少m次,{o,n}最多n次
(3)位置锚定:
^:行首
$:行尾
\<, \b:词首
\>,\b:词尾
(4)分组及引用:
( ):分组
\1,\2,…:后向引用
注意:特殊用法
C|cat:表示C或cat ,表示整个左侧或整个右侧。
(C|c)at:表示Cat或cat
三、作业练习:
1、显示/etc/passwd文件中以bash结尾的行;
2、找出/etc/passwd文件中的三位或四位数;
3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行
4、找出"netstat -tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行;
5、找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个字母的行;
6、找出”ldd /usr/bin/cat“命令的结果中文件路径;
7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;
8、显示当前系统上root、centos或spark用户的相关信息;
9、echo输出一个绝对路径,使用egrep取出其基名;
10、找出ifconfig命令结果中的1-255之间的整数;
转载于:https://blog.51cto.com/zhangpenglinux/1748897