代码改变世界

shell(sed/gawk)脚本(计算目录文件/验证电话号码/解析电子邮件地址)

2013-08-01 10:18  夏洛克·福尔摩斯  阅读(1509)  评论(1编辑  收藏  举报

1、计算目录文件

#!/bin/bash
mypath=`echo $PATH | sed 's/:/ /g'`#注意` ` 和 ‘ ’
count=0
for directory in $mypath
do
    check=`ls $directory`
    for item in $check
    do    
            count=$[ $count + 1 ]#注意空格
    done
    echo "$directory -$count"
    count=0
done

 2、验证电话号码

显示电话号码有以下几种常用的方法:

(123)456-7890

(123) 456-7890

123-456-7890

123.456.7890

这样,用户输入他们的电话号码的方法就有4中,正则表达式必须满足所有情形。

构建正则表达式时,最好从左边开始,构建匹配可能遇到的全部字符的模式。在本例中,第一件事是电话号码中可能有也可能没有一个左圆括号。这个字符可以使用下面的模式来匹配:

^\(?

使用脱字符(^)指出数据开头。由于左圆括号是一个特殊字符,所以必须将它转义为普通字符使用。问号表示左圆括号可以出现、也可以不出现在匹配的数据中。

接下来3位数字的地区代码。在美国,地区代码以数字2开始(无0或1),最大可以到9.为匹配地区代码,可以使用模式:

[2-9][0-9]{2}

在地区代码之后,结束右括号可以存在也可以不存在:

\)?

在地区代码之后可以是一个空格、没有空格、短划线或圆点。可以使用字符组合以及管道符号组合它们:

(| |-|\.)

第一个管道符号立即出现在圆括号之后,以匹配没有空格的情况。对于圆点,必须使用转义字符;否则,就会取其匹配任意字符的特殊含义。

再接下来是3位数字的交换号码:

[0-9]{3}

在电话交换码之后,必须匹配一个空格、破折号或点字符:

( |-|\.)

然后,结束整个验证过程,必须匹配字符串尾部、4位数字的本地电话扩展码:

[0-9]{4}$

将整个模式放在一起,得到:

^\(?[2-9][0-9]{2}\)?(| |-|\.)[0-9]{3}( |-|\.)[0-9]{4}$

在gawk程序中使用正则表达式表示间隔时,必须使用--re-interval命令行选项,否则就得不到正确的结果。

gawk --re-interval '/^\(?[2-9][0-9]{2}\)?(| |-|\.)[0-9]{3}( |-|\.)[0-9]{4}$/{print $0}'

 

3、解析电子邮件地址

电子邮件地址的基本形式为:

username@hostname

username的值可以使用任意字母数字,以及下面几个特殊字符:

圆点、短划线、加号、下划线。

在有效的电子邮件用户ID中,这些字符可以任意形式的组合出现。电子邮件地址的hostname部分由一个或多个域名和服务器名组成。服务器和域名也必须遵守严格的命名规则,仅允许字母数字字符以及下面的特殊字符:

圆点、下划线

服务器和域名之间分别用圆点隔开,且先指定服务器名,然后指定子域名,最后是没有后缀圆点的顶级域名。

从左边开始设计正则表达式模式。用户名可以有多个合法字符。

^([a-zA-Z0-9_\-\.\+]+)@

这样的组合可以指定用户名中允许的字符,加号表示要存在至少一个字符。下一个字符显然应该是@。

主机名模式使用相同的方法匹配服务器名和子域名:

([a-zA-Z0-9_\-\.]+)

这个模式可以匹配文本:

server

server.subdomain

server.sbudomain.subdomain

对于顶级域名有特殊的规则。顶级域名只能是字母字符,并且不能少于两个字符且长度不能超过5个字符。用于顶级域名的正则表达式为:

\.([a-zA-Z]{2,5})$

将整个模式组合在一起得到:

^([a-zA-Z0-9_\-\.\+]+)@(a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$