shell正则表达式

正则表达式在每种语言中都会有,功能就是匹配符合你预期要求的字符串。
Shell 正则表达式分为两种:
  •  基础正则表达式
  • 扩展正则表达式:扩展的表达式有+、?、| 和()
  1. 正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法
  2. 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。
Linux正则表达式一般以行为单位处理。
 
正则表达式和通配符有本质区别
  1. 不需要思考的判断方法:在三剑客awk,sed,grep都是正则,其他都是通配符
  2. 区别通配符和正则表达式最简单的方法:
    (1)文件目录名===>通配符
     (2)文件内容(字符串,文本【文件】内容)===>正则表达式
 
注意:在匹配模式中一定要加上引号
符号
描述
                               实例                                
.
匹配任意单个字符(必须存在)
例子:l..e
可以表示
love
like
^
 
匹配前面字符串开头
 
匹配以 abc 开头的行:
echo -e "abc\nxyz" |grep ^abc
$
 
匹配前面字符串结尾
 
匹配以 xyz 结尾的行:
echo -e "abc\nxyz" |grep xyz$
*
 
匹配前一个字符的零个或多个
 
a*  表示出现任意个a的情况
a*b 表示b前面有任意个a的情况(包括没有a的情况)
.* 
表示任意长度的任意字符
例子:过滤出一行中a在前,b在后的行
条件:
包含 a 和 b
字母 a 必须在 b前面
# grep --color "a.*b" b.txt
+(扩展正则)
 
表示其前面的字符出现最少一次的情况
 
匹配 abc 和 abcc:
echo -e "abc\nabcc\nadd" |grep -E 'ab+'
匹配单个数字:echo "113" |grep -o '[0-9]'
连续匹配多个数字:echo "113" |grep -E -o '[0-9]+'
?(扩展正则)
 
表示其前面的字符出现最多一次的情况(可以0个)
 
匹配 ac 或 abc:
echo -e "ac\nabc\nadd" |grep -E 'a?c'
[]
 
表示范围内的一个字符
例子:过滤出包含数字的行           grep [0-9] a.txt
例子:过滤出包含数字和小写字母的行 grep [0-9a-z] a.txt
例子:过滤出包含字母asf的行        grep [asf] a.txt
[ .-.]
 
匹配中括号中范围内的任意一个字符
 
匹配所有字母
echo -e "a\nb\nc" |grep '[a-z]'
[^]
 
匹配[^字符]之外的任意一个字符
 
匹配 a 或 b:
echo -e "a\nb\nc" |grep '[^c-z]'
匹配末尾数字:echo "abc:cde;123" |grep -E
'[^;]+$'
^[^]
 
匹配不是中括号内任意一个字符开头的行
 
匹配不是#开头的行:
grep '^[^#]' /etc/httpd/conf/httpd.conf
{n}或者{n,}
 
匹配花括号前面字符至少 n个字符
 
echo "aadadccc" | egrep "a{2}"
echo "aadadccc" | egrep "a{1}"
{n,m}
 
匹配花括号前面字符至少 n个字符,最多 m 个字符
 例子:
"ac\{2,5\}b" 匹配a和b之间有最少2个c最多5个c的行
"ac\{,5\}b" 匹配a和b之间有最多5个c的行
"ac\{2,\}b" 匹配a和b之间有最少2个c的行
\<
 
 锚定单词首部(单词一般以空格或特殊字符做分隔)
 
# echo "hi,root,iamroot" | grep "\<root"
hi,root,iamroot
 
# echo "hi,root,iamroot" | grep "\<root\>"
hi,root,iamroot
 
\>
 锚定单词尾部(单词一般以空格或特殊字符做分隔,)
 
 
# echo "hi,root,iamroot" | grep "root\>"
hi,root,iamroot
# echo "hi,root,iamroot" | grep "\<root\>"
hi,root,iamroot
()
 
\1  调用前面的第一个分组,即调用前者的结果给后者
 
 
例子:过滤出一行中有两个相同数字的行
# grep "\([0-9]\).*\1" inittab
 
例子:过滤出行首和行尾字母相同的行
# grep "^\([a-z]\).*\1$" inittab
 
| (扩展正则)
 
匹配竖杠两边的任意一个
 例子:过滤出cat 或者Cat
# egrep "cat|Cat" a.txt
# egrep "(C|c)at" a.txt
正则表达式中的{}以及()都需要加上\进行转义,而扩展正则表达式不需要
扩展正则加了\ 形成冲突导致无用。
|, ?,+是扩展正则独有的
锚定单词首部和尾部在扩展正则以及正则中都需要加上\
posted @ 2019-03-04 20:17  疯狂的⑨酱  阅读(939)  评论(0编辑  收藏  举报