Linux shell正则表达式

Linux shell正则表达式
定义:用来过滤文本的模式模板。
正则表达式类型:正则表达式是用正则表达引擎(regular expression engine)实现的。
在Linux中,有两种流行的正则表达式引擎:
1》POSIX基本正则表达式(BRE)引擎;
2》POSIX扩展正则表达式(ERE)引擎。
1、纯文本
$ echo "This is a test" | sed -n '/test/p'
2、特殊字符
正则表达式的特殊字符包括:.*[]^${}\+?|()
$ echo "The cost is \$4.00" | sed -n '/\$/p'
3、锚字符
脱字符(caret character, ^)定义从数据流中文本行的行首开始的模式。
美元符($)特殊字符定义了行尾锚点。
$ echo "This is a test" | sed -n '/^This is a test$/p'
4、点字符
点符号用来匹配任意的单字符,除了换行符,但点字符必须匹配一个字符,如果在点字符的位置没有字符,那么模式就不成立。
$ cat data2
This is a test of a line.
The cat is sleeping.
That is a very nice hat.
This test is at line four.
$ sed -n '/.at/p' data2
The cat is sleeping.
That is a very nice hat.
This test is at line four.
5、字符组
$ sed -n '/[ch]at/p' data2
The cat is sleeping.
That is a very nice hat.
6、排除字符组
$ sed -n '/[^ch]at/p' data2  
This test is at line four.
7、使用区间
$ cat data3
60633
46201
223001
4353
22203
$ sed -n '/^[0-9][0-9][0-9][0-9]$/p' data3 
4353
8、特殊字符组
除了定义自己的字符组外,BRE还包含可用来匹配字符类型的特殊字符组。
[[:alpha:]]     匹配任意字母字符,不管大小写
[[:alnum:]]     匹配任意字母数字字符0~9、A~Z、a~z
[[:blank:]]     匹配空格或制表符
[[:digit:]]     匹配0~9之间的数字
[[:lower:]]     匹配小写字母
[[:print:]]     匹配任意可打印字符
[[:punct:]]     匹配任意标点符号
[[:space:]]     匹配任意空白字符:空格、制表符、NL、FF、VT和CR
[[:upper:]]     匹配任意大写字母
9、星号
$ echo "ik" | sed -n '/ie*k/p'
ik
$ echo "iek" | sed -n '/ie*k/p' 
iek
$ echo "ieik" | sed -n '/ie*k/p'   
ieik
 
POSIX ERE模式包括一些Linux应用和工具使用的若干额外符号。awk程序能够识别ERE模式,但sed编辑器不能
1、问号
问号表示前面的字符可以出现0次或1次,但仅限于此。它不会匹配多次出现该字符。
$ echo "bt" | awk '/be?t/ {print $0}' #出现0次
bt
$ echo "bet" | awk '/be?t/{print $0}' #出现1次
bet
2、加号
加号是类似于星号的另一种模式符号,但跟问号也有不同。加号表明前面的字符可以出现1次或多次,但必须至少出现1次。
$ echo "beet" | awk '/be+t/ {print $0}'
beet
$ echo "bt" | awk '/be+t/ {print $0}'
3、使用花括号
ERE中的花括号允许你为可重复的正则表达式指定一个上限。这通常称为区间(interval)。
1》m     正则表达示准确出现m次。
2》m, n  正则表达示至少出现m次,至多n次。
awk好象不支持
4、管道符号
管道符号允许你在检查数据流时,用逻辑OR方式指定正则表达式引擎的两个或多个模式。
使用管道符号的格式如下:
expr1 | expr2 | ...
 
$ echo "The cat is asleep" | awk '/cat | dog/{print $0}'
The cat is asleep
5、聚合表达式
正则表达式模式也可以用圆括号聚合起来。当你聚合正则表达示模式时,该组就被当成标准字符。你可以在组内使用特殊字符。
$ echo "Sat" | awk '/Sat(urday)?/ {print $0}'
Sat
将聚合和管道符号一起使用来创建可能的模式匹配组也是常见的:
$ echo "cat" | awk '/(c|b)a(b|t)/ {print $0}'
cat
 
实用中的正则表达式
 
1、目录文件计数
$ cat countfiles.sh
#!/bin/bash
#count number of files in your path
mypath=`echo $PATH | sed 's/:/ /g'`
count=0
for dir in $mypath
do
    check=`ls $dir`
    for item in $check
    do
        count=$[ $count + 1]
    done
    echo "$dir -- $count"
    count=0
done
 
$ ./countfiles.sh
/usr/lib/lightdm/lightdm -- 2
/usr/local/sbin -- 0
/usr/local/bin -- 0
/usr/sbin -- 237
/usr/bin -- 1858
/sbin -- 175
/bin -- 151
/usr/games -- 4
 
2、验证邮件地址
$ cat isE-mail.sh
#!/bin/bash
#test email address
awk '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]+)$/ {print $0}'
 
echo "rich@here.com" | ./isE-mail.sh
rich@here.com
posted @ 2012-12-16 13:06  sinaxyz  阅读(1989)  评论(0编辑  收藏  举报