正则匹配在shell 脚本中的应用

sed, awk, grep 等常用shell命令,都可以与正则匹配 配合使用。

grep与egrep

grep命令格式:

grep [option] pattern filename  注意:pattern如果是表达式或者超过两个单词的,需要用引号引用。可以是单引号也可以是双引号,区别是单引号无法引用变量而双引号可以。

egrep 等价于 grep -E  可以使用基本的正则表达式外,还可以用扩展表达式。注意区别。

扩展表达式:

(数量限定符中,* 不属于扩展表达式范畴。而 ?、+则输入扩展表达式范畴)

+ 匹配紧跟在他前面的字符1次或者多次,至少一次

?匹配紧跟在他前面的字符0次或者1次

a|b|c 匹配a或b或c

() 字符组, 如: love(able|ers) 匹配 loveable 或 loveers

(..)(..)\1\2  模板匹配。  \1 代表前面第一个模板, \2 代表第二个括弧里面的模板。

x{m,n}  等价于 x\{m,n\}  x的字符数量在m到那个之间

首先,了解shell中正则匹配的一些基本常识:

位置限定符:

字符 含义 举例
^ 匹配行首的位置 ^Include 匹配行首为 Include 的行
$ 匹配行末的位置 mysql$ 匹配行末为 mysql 的行;^$匹配空行

举例:

数量限定符:

字符 含义 举例
? 匹配紧跟在他前面的单元0次或1次  
+ 匹配紧跟在他前面的单元1次或多次  
* 匹配紧跟在他前面的单元0次或多次  
{n} 匹配紧跟在他前面的单元确定的n次,n是非负整数  
{n,} 匹配紧跟在他前面的单元至少n次,n是非负整数  
{n,m} 匹配紧跟在他前面的单元至少匹配n次且最多匹配m次。注意:在逗号和两个数之间不能有空格,n,m均为非负整数  

举例:

特殊字符:

字符 含义 举例
\ 转义字符,普通字符转为特殊字符,特殊字符转为普通字符 81\"匹配81“
() 将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符 ([0-9]{1,3}.){3}[0-9]{1,3} 匹配ip地址
. 匹配任何的单个字符。要匹配 .,请转义使用 \.。  

\ 举例:

() 和 . 举例:

综合举例:

以一个自动监控linux端口的脚本 为例;将脚本命令拆分成如下几个主机深入的例子。最后再汇总成一个完整的监控linux端口的shell脚本。

例1:

[root@mysql-master ~]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      946/zabbix_agentd   
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      673/rpcbind         
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      930/sshd            
tcp6       0      0 :::10050                :::*                    LISTEN      946/zabbix_agentd   
tcp6       0      0 :::3306                 :::*                    LISTEN      965/mysqld          
tcp6       0      0 :::111                  :::*                    LISTEN      673/rpcbind         
tcp6       0      0 :::22                   :::*                    LISTEN      930/sshd

命令说明: 使用netstat 命令输出端口号;-tlnp=tcp协议+listen状态+不显示别名+显示程序名称

例2:

[root@mysql-master ~]# netstat -tlnp|awk '{print $4}'
(only
Local
0.0.0.0:10050
0.0.0.0:111
0.0.0.0:22
:::10050
:::3306
:::111
:::22

命令说明: 使用netstat 命令输出端口号;-tlnp=tcp协议+listen状态+不显示别名+显示程序名称;awk '{pring $4}'表示输出第4个字段(如0.0.0.0:10050),$1~$9 表示输出的第几个字段列,$NF表示最后一个字段。

例3:

[root@mysql-master ~]# netstat -tlnp|awk '{print $4}'|awk -F ':' '{if ($NF~/^[0-9]*$/) print $NF}'
10050
111
22
10050
3306
111
22
[root@mysql-master ~]# netstat -tlnp|awk '{print $4}'|awk -F ':' '{if ($NF ~ /^[0-9]*$/) print $NF}'
10050
111
22
10050
3306
111
22

命令说明: 使用netstat 命令输出端口号;-tlnp=tcp协议+listen状态+不显示别名+显示程序名称;awk '{pring $4}'表示输出第4个字段,$1~$9 表示输出的第几个字段列,$NF表示最后一个字段;awk -F ':' '{if ($NF ~ /^[0-9]*$/) print $NF}' 表示以冒号为分隔符进行截取,且只能是0~9的数字,这里 ~ 表示匹配,类似nginx 配置中的 ~

例4:

[root@mysql-master ~]# netstat -tlnp|awk '{print $4}'|awk -F ':' '{if ($NF ~ /^[0-9]*$/) print $NF}'|sort|uniq
10050
111
22
3306
[root@mysql-master ~]# 

命令说明: 使用netstat 命令输出端口号;-tlnp=tcp协议+listen状态+不显示别名+显示程序名称;awk '{pring $4}'表示输出第4个字段,$1~$9 表示输出的第几个字段列,$NF表示最后一个字段;awk -F ':' '{if ($NF ~ /^[0-9]*$/) print $NF}' 表示以冒号为分隔符进行截取,且只能是0~9的数字,这里 ~ 表示匹配,类似nginx 配置中的 ~;|sort|uniq表示排序和去重

到底

猜你喜欢

转载自blog.csdn.net/wudinaniya/article/details/93850832
今日推荐