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表示排序和去重
到底