正则表达式就是处理字符串的方法,它通过一些特殊符号的辅助,可以让用户轻易达到查找,删除,替换某特定字符串的处理程序.
一.grep
作用:文本搜索工具,根据用户指定模式(过滤条件).对目标文本逐行进行匹配检查;打印匹配到行
grep [option] [--color=auto] '查找字符串' filename
选项:
-c: 计算找到'查找字符串'的次数
-i :忽略大小写的不同,不区分大小写
-o :仅显示匹配到的字符串
-n: 顺便输出行号
-v :反向选择,即显示出没有'查找字符串'内容的那一行
-q:静默模式,既不输出结果
-E:支持使用扩展的正则表达式
--color=auto 可以将关键字部分加上颜色显示
-A#:after,后#行
-B#:before 前#行
-C#:context,前后各#行
基本正则表达式的元字符:
字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[:digit:]任意数字0-9之间
[:lower:]任意小写字母
[:upper:]任意大写字母
[:alpha:]任意大小写字母
[:alnum:]任意数字或字母
[:space:]空格
[:punct:]标点符号
匹配次数:用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数
*:匹配前面的字符任意次:0,1,多次:
.*:匹配0个或多个任意字符
\?:匹配前面的字符0次或 一次;即前面的字符是可有可无的
\+:匹配前面的字符1次或多次;即前面的字符要出现至少一次
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少n次,至多n次
\{0,n\} :至多n次
\{m,\} :至少m次
位置锚定:
^:行首锚定:用于模式的最左侧
$:行尾锚定;用于模式的最右侧
^PATTERNS:用于PATTERNS来匹配整行
^$:空白行
^[[:space:]]*$:空行或包含空白字符的行
单词:非特殊字符组成的连续字符(字符串)都称为单词
\<或\b:词首锚定,用于单词模式的左侧:
\>或\b:词尾锚定,用于单词模式的右:
\<PATTERN\>:匹配完整单词
分组及引用
\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理
\(xy\)*ab
note:分组括号中的模式分配到的内容会被正则表达式引擎自动记录在内部的变量中,这些变量为:
\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
\2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配的字符
\3:......
后向引用:引用前面的分组括号中的模式所匹配的字符;
实例:
1.查找带有ch的字符串
或
(2)在文件test.txt中取得无论大小写的"the"
[root@localhost ~]# grep -in 'the' test.txt -i:忽略大小写;-n显示行数 8:I can't finish the test. 9:Oh! The soup taste good. 12:the symbol '*' is represented as start. 14:The gd software is a library for drafting programs. 15:You are the best is mean you are the no. 1. 16:The world <Happy> is the same with "glad". 18:google is the best tools for search keyword.
(3)在test.txt中查找带有test或taste两个单词.
[root@localhost ~]# grep -n t[ae]st test.txt
test和taste都带有t[]st []里面无论有几个字符,都代表任意一个字符
8:I can't finish the test.
9:Oh! The soup taste good..
(4)查找test.txt中oo前面没有小写字符的字符段
[root@localhost ~]# grep -n '[^a-z]oo'test.txt 3:Football game is not use feet only.
练习:
(1)找出etc/passwd文件中的两位或三位数
[root@localhost ~]# grep -n "\<[0-9]\{2,3\}\>" /etc/passwd
(2)找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,而且后面非空白字符的行
[root@localhost ~]# grep -n "^[[:space:]]\+[^[:space:]]" /etc/rc.sysinit
(3)找出"netstat -tan"命令的结果中以"LISTEN"后跟0.1或多个空字符结尾的行
[root@localhost ~]# netstat -tan |grep -n "LISTEN[[:space:]]*$"
二.egrep
支持扩展的正则表达式实现雷士与grep文本过滤功能:grep -E
egrep [OPTIONS] PATTERN[files..]
选项:
-i,-o,-v,-q,-A,-B,-C
-G支持基本正则表达式
扩展正则表达式的元字符:
字符匹配:
.:任意单个字符
[]:指定范围的单个字符
[^]:指定范围外的任意单个字符
次数匹配:
*:任意次,0,1或多次
?:0次或一次,其前的字符是可有可无的
+:其前字符至少1次
{m}其前的字符m次
{m,n}:至少m次,至多n次
...
位置锚定
^:行首锚定
$:行尾锚定
\<:词首锚定
\>:词尾锚定
分组及引用
()分组:括号内的模式[匹配到的字符会被记录与正则表达式引擎的内部变量中:
向后引用:\1,\2,...
或
a|b;C或cat
(c|C)at,cat或Cat
实例练习
(1)找出/proc/meminfo 文件中,所有以大小写s开头的行,至少写三种
[root@localhost ~]# grep -in "^s" /proc/meminfo [root@localhost ~]# grep "^[Ss]" /proc/meminfo [root@localhost ~]# egrep "^[S|s]" /proc/meminfo
(2).显示当前系统上root,centos或user1用户的相关信息
[root@localhost ~]# egrep "^(root|centos|user1)\>" /etc/passwd
(3)找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
[root@localhost ~]# egrep -no "[[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
(4)使用echo命令输出一绝对路径,使用egrep取出基名
[root@localhost ~]# echo /etc/sysconfig/ |grep -E -o "[^/]+/?$" sysconfig/
fgrep :不支持正则表达式元字符
当无需用到元字符去编写模式时,使用fgrep会更好