正则表达式--通常用于判断语句中,用来检查某一字符串是否满足某一格式
正则表达式是由普通字符与元字符组成
普通字符包括大小写字母、数字、标点符号及一些其他符号
元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
基础正则表达式常见元字符: (支持的工具: grep, egrep, sed, awk)
注: egrep, awk使用(n}、{n,}、(n,m}匹配时"{}"前不用加"\"
\ | 转义字符,用于取消特殊符号的含义 | 例: \!、\n、\s等 |
^ | 匹配字符串开始的位置 | 例: ^a、^the、^#、^[a-z] |
$ | 匹配字符串结束的位置 | 例: word$、^$匹配空行 |
. | 匹配除\n之外的任意的一个字符 | 例: go.d、g..d |
* | 匹配前面子表达式0次或者多次 | 例: goo*d、go.*d |
[list] | 匹配list列表中的一个字符 | 例: go[ola]d, [abc]、[a-z]、[a-z0-9]、[0-9]匹配任意一位数字 |
[^list] | 匹配任意非list列表中的一个字符 | 例: [^0-9]、[^A-Z0-9]、[^a-z]匹配任意一位非小写字母 |
\{n\} | 匹配前面的子表达式n次 | 例: go\{2\}d. ‘[0-9]\{2\}‘匹配两位数字 |
\{n,\} | 匹配前面的子表达式不少于n次 | 例: go\{2,\}d, ‘[0-9]\{2,\}‘匹配两位及两位以上数字 |
\{n,m\} | 匹配前面的子表达式n到m次 | 例: go\{2,3\}d. ‘[0-9]\{2,3\}‘匹配两位到三位数字 |
扩展正则表达式元字符: (支持的工具: egrep,awk)
+ | 匹配前面子表达式1次以上 | 例: go+d,将匹配至少一个o,如god, good, goood等 |
? | 匹配前面子表达式0次或者1次 | 例: go?d,将匹配gd或god |
() | 将括号中的字符串作为一个整体 | 例: g(oo) +d,将匹配oo整体1次以上,如good, gooood等 |
| | 以或的方式匹配字条串 | 例: g(oo|la)d,将匹配good或者glad |
正则表达式匹配E-mail地址
用户名@: ^ ( [a-zA-Z0-9_\-\.\+]+) @
子域名: ([a-ZA-Z0-9_\-\.]+)
*域名(字符串长度一般在2到5): \.([a-ZA-z]{2,5})$
egrep ‘^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$‘ email.txt
awk ‘/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/(print $0}‘ email.txt
Shell正则表达式匹配IP地址
^([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
案例:
写个shell脚本,要求ping一批服务器,每台服务器ping5个包,取出时延>=50ms或丢包的服务器
#!/bin/bash for ip in `cat ip.txt` do count=$(ping -c 5 -i 2.5 -w 3 $ip | grep icmp_seq | wc -l) delay=$(ping -c 5 -i 0.5 -w 3 $ip | grep from |cut -d ‘=‘ -f4 |cut -d ‘.‘ -f1) if [ $count -lt 5 ];then echo "$ip packet lost" >> /opt/test.txt fi for i in $delay do if [ $i -ge 50 ];then echo "$ip delay" >> /opt/test.txt break fi done done
写个shell脚本实现把点分十进制的IP地址,转换成点分二进制
#!/bin/bash switch() { ip=$1 num=$(echo $ip | tr ‘.‘ ‘ ‘) for a in $num do i=256 for b in {1..8} do i=$[$i/2] A=$[$a-$i] if [ $A -lt 0 ];then echo -n 0 else echo -n 1 a=$[$a-$i] fi done echo -n ‘.‘ done } IP=$1 res=$(switch $IP) echo ${res%.*}