一 正则表达式
正则表达式:描述某些字符串匹配规则的工具
使用原因:程序设计过程中不可避免的遇到处理某些文本情况,有时候要查找符合某些比较复杂规则的字符串。正则表达式以非常简单的代码完成。
常见的支持正则表达式的UNIX工具:
grep命令族:用于匹配文本行
sed流编辑器:用于改变输入流
awk:用于处理字符串的语言
more或者less等:文件查看程序
ed,vi或者vim等:文本编辑器
实践正则表达式:
#! /bin/bash
str=`catversion.txt|grep rev`
echo"$str"
(cat命令用来显示文本内容,竖线是管道,表示将cat命苦的输出结果作为后面的那个命令的输入,grep命令用来查找文本,rev指要匹配的字符串。上面执行结果表示version.txt文件中的某一行含义rev这个字符串,实际上,grep命令后面的参数可以换成任意的正则表达式)
1.1 正则表达式原理
正则表达式是对文本进行过滤的工具,之所以有过滤文本的功能,因为它定义了一系列的元字符,通过元字符配合其他字符来表达出一种规则。只有符合该规则的文本才能保留下来。
元字符:描述字符的字符。
元字符作用:对表达式的内容,转换以及各种操作信息进行描述。
1.2 基本正则表达式又称标准正则表达式,仅支持最基本的元字符集。
基本正则表达式定义的元字符主要有:
1)行首定位符 “^”
用来匹配行首的字符。表示行首的字符是^后面的那个字符。
行首定位符位于所作用的字符之前
例如:
#列出/etc目录中的以字母po开头的文件名
str=`ls /etc |grep "^po"`
echo"$str"
(^po理解为第一个字符为p,紧跟着一个字母o的文本行。不要理解为字符串po开头的文本行。)
2)行尾定位符”$”
作用:定位文本行的末尾。
行尾定位符位于所作用的字符之后。
#列出/etc目录中以conf结尾的文件名
str=`ls /etc |grep "conf$"`
echo"$str"
结果:anthy-conf
asound.conf
注意:
精确匹配一个文本行:^cat$ 完全匹配cat的文本行
^$:匹配所有空行
单独的^和$没有任何意义,因为任何一个文本行都有开头和结尾。
3)单个字符匹配”.”
圆点.用来匹配任意单个字符。包括空格,但不包括换行符\n。当使用”.”后,意味着该位置一定有一个字符,无论他是什么字符。
例:
#列出所有的包含字符串“samba”的文件名,不管samba后面有没有字符
str=`ls /etc |grep "samba"`
echo"$str"
echo"==============================="
#列出包含字符串samba,且samba后面只是含义一个字符
str=`ls /etc |grep "samba."`
echo"$str"
结果:samba
samba4
======================
samba4
(可以连续使用..来匹配多个字符,如l..p,匹配含义字母l,然后是两个任意字符,再接着是字母p的字符串)
4) 限定符“*”
限定符本身不代表任何字符,用来指定其前面的一个字符必须重复出现多次才能满足匹配。而星号表示匹配其前导字符的任意次数,包括0次
#筛选出以字符s开头,紧跟着1个字符s,再接着任意个字符s的文件名
str=`ls /etc |grep "^sss*"`
echo"$str"
结果:ssh
ssl
sssd
5) 字符集匹配“[]”
只要某个字符串在方括号所在的位置上出现了方括号中的任意一个字符,就满足匹配规则。
对于连续的数字或字母,可使用连字符-来表示一个范围。
如:[a-f]表示匹配a到f中的任意一个字母
[0-9]匹配任意单个数字
#筛选所有以字符r开头,并且紧跟着1个字符c的文本行
str=`ls /etc |grep "^rc"`
echo "$str"
echo "=============================="
#筛选所有以字符r开头,紧跟着1个字符为c,下面1个字符为单个数字的文本行
str=`ls /etc | grep "^rc[0-9]"`
echo "$str"
6)字符集不匹配“[^]”
1.3 扩展正则表达式
(egrep命令默认使用扩展正则表达式)
1 )限定符“+”
“+”限定前面的字符至少出现一次。
#筛选以字符串“ss”开头,后面至少紧跟着1个字符“s”的文本行
str=`ls /etc |egrep "^sss+"`
echo"$str"
结果:sssd
2)限定符“?”
限定前面的字符最多只出现一次。
#筛选以字符串“ss”开头,后面跟着0或者1个s的文本行
str=`ls /etc |egrep "^sss?"`
echo"$str"
结果:ssh,ssl,sssd
3)竖线“|”和圆括号“()”
竖线|表示多个正则表达式之前或的关系
圆括号表示一组可选值得集合。
竖线和圆括号经常一起使用,表示一组可选值。
#筛选含有字符串“ssh”、“ssl”或者以字符串“yum”开头的文本行
str=`ls /etc |egrep "(ssh|ssl|^yum)"`
echo"$str"
1.4 Perl正则表达式
1)数字匹配\d
2)非数字匹配\D
3)空白字符匹配\s
4)非空白字符匹配\S
1.5正则表达式应用
匹配单个字符
1 单个一般字符
英文字符,数字,空白字符以及标点符号
#搜索demo2.txt含有字符“a”的文本行
str=`grep"a" demo2.txt`
echo"$str"
2 转义后的元字符
要匹配元字符本身,需要在这些字符的前面加上\,关闭这些元字符的特殊意义,保留其字面意义。
反斜线也是一个元字符,如果要匹配,也要加\,即表达式“\\”表示匹配一个反斜线。
3 方括号表达式
当元字符位于方括号中时,除了连字符-或者^之外,其他元字符都会失去特殊意义。如:
[\.]表示的是反斜线\和圆点.这两个字符。如果要匹配圆点,[.]就可以了。
匹配多个字符
1 将多个字符按照指定顺序拼接起来
#搜索字符串“matter”
str=`grep"matter" demo3.txt`
echo"$str"
2 方括号或星号等配合
#匹配任意多个字符“o”
str=`grep"lo*king" demo3.txt`
echo"$str"
例子:筛选符合指定格式的电话号码
#筛选符合格式的电话号码
str=`egrep"800-[[:digit:]]{3}-[[:digit:]]{4}$" demo4.txt`
echo"$str"
1.6 正则表达式优先级
\ 转义符
[] 方括号表达式
() 分组
*,+?{m},{m,},{m,n} 限定符
普通字符 从左到右顺序
^,$ 定位符
| 或运算
(从高到低)
1.7 子表达式
由多个普通字符或者元字符组成的一个小的正则表达式。作为一个大的正则表达式的一部分使用,不能单独使用。使用圆括号括起来。
例子:匹配IP地址
#匹配IP地址
str=`egrep"^([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}$" ip.txt`
echo"$str"
(子表达式表示匹配1-3个数字,然后是一个圆点。整个表达式描述的字符串以3组重复的1-3个数字后跟一个圆点开头,然后以1-3个数字结尾)
精确匹配IP地址:
#匹配正确IP地址
str=`egrep"^([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"ip.txt`
echo"$str"
1.8 通配符
shell本身不支持正则表达式,使用正则表达式的是shell命令和工具。
shell使用了正则表达式中的某些元字符作为通配符,常用的有*,?,[],{},^等。但意义有所不同。
如:*表示匹配任意的字符,在非正则表达式中限制其前导字符的0次或多次重复。
例:
列出以ex开头的当前目录中所有的文件:ls–l ex*
列出以字符d或e开头的文件:ls –l [de]*
1.9 grep命令
grep命令使用正则表达式来搜索文本,并且把匹配的文本打印出来。
grep [options]pattern [file]
option表示选项,pattern表示匹配的模式。file表示一系列文件名。
常用选项:
-c 只打印匹配的文本行的函数,不显示文本内容。
-i 匹配时忽略字母大小写
-h 当搜索多个文件,不显示匹配文件名前缀。
-l 只列出含义匹配的文本行的文件的文件名,不显示其具体匹配的内容。
-n 列出所有匹配的文本行,并显示行号
-s 不显示关于不存在或无法读取文件的错误信息
-v 只显示不匹配的文本行。
-w 匹配整个单词
-x 匹配整个文本行
-r 递归搜索,不仅搜索当前目录,还有各级子目录