shell(sed/gawk)脚本(计算目录文件/验证电话号码/解析电子邮件地址)
2013-08-01 10:18 夏洛克·福尔摩斯 阅读(1517) 评论(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})$