正则表达式
- 概述:使用一组字符串来描述,匹配一系列符合某个句法规则的字符串。广泛适用于脚本编辑,文件编辑器如,PHP,Java,Python,Perl,shell等。
- 优点:可以方便编辑,使用对文本的增删改查等操作。
- 正则表达式分类
- 基础正则表达式
- 扩展正则表达式
- linux中常用的文本处理工具
- grep:匹配,查询
- sed:编辑(增删改查)
- awk:文本格式化(字符串提取)
- 通配符
- “*” 任意长度字符串
- “?”单个任意字符串
- grep命令的参数
- -v:排除匹配的内容
- -E:支持扩展的正则表达式
- -l:忽略大小写
- -n:显示行号
- -q:匹配内容不显示
- -c:只对匹配行的计数
- 基础正则表达式
- \:转义字符
- ^:以...开头
- $:以...结束
- ^$:表示空行
- .:匹配任意一个字符
- *:匹配0次或者多次
- .*:匹配任意字符串
- 【list】:列表
- 【^list】:非list表中的
- {n}:匹配子表达式n次
- {n,}:匹配子表达式至少n次
- {n,m}:匹配子表达式至少n次,最多m次
- eg:
nl test.txt
1 gd
2 god
3 good
4 goood
5 gooood
6 gold
7 glad
8 gaad
9 abCDf
10 food
11 162478383
12 HELLO
13 010-666888
14 0665-5666888
15 ip 192.168.200.10
16 ip 1.2.3.4
17 pay $180
#打印出包括"$"字符的行且打印出行数
[root@localhost ~]# grep -n '\$' test.txt
17:pay$180
[root@localhost ~]# awk '/\$/{print}' test.txt
pay$180
#过滤出以小写字母开头的行(非:在里面添加非^)
[root@localhost ~]# grep "^[a-z]" test.txt
[root@localhost ~]# sed -n '/^[a-z]/p' test.txt
[root@localhost ~]# awk '/^[a-z]/{print}' test.txt
#过滤出以数字为结尾的行
[root@localhost ~]# grep '[0-9]$' test.txt
[root@localhost ~]# sed -n '/[0-9]$/p' test.txt
[root@localhost ~]# awk '/[0-9]$/{print}' test.txt
#查看go0*d go.d go+d go.*d go?d 区别
[root@localhost ~]# grep -E "go.d" test.txt
good
gold #.表示匹配任意字符
[root@localhost ~]# grep -E "go.*d" test.txt
god
good
goood
gooood
gold #.*表示匹配任意字符
[root@localhost ~]# grep -E "go*d" test.txt
gd
god
good
goood
gooood #*表示匹配0次到多次
[root@localhost ~]# grep -E "go+d" test.txt
god
good
goood
gooood #+表示匹配大于等于一次
[root@localhost ~]# grep -E "go?d" test.txt
gd
god #?表示匹配0次或1次
#过滤出电话号码
[root@localhost ~]# grep -E '[0-9]{3,4}-[0-9]{7,8}' test.txt
[root@localhost ~]# sed -n '/[0-9]\{3,4\}-[0-9]\{7,8\}/p' test.txt
010-6668888
0665-5666888
#过滤出IP地址
[root@localhost ~]# grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' test.txt
[root@localhost ~]# grep -E '([0-9]{1,3}\.){1,3}[0-9]{1,3}' test.txt
ip 192.168.200.10
ip 1.2.3.4
- 扩展正则表达式
- +:匹配一次以上
- ?:匹配0次或一次
- ():括号内为一个整体
- |:或者
#过滤ifconfig中的ip
[root@localhost ~]# ifconfig ens33 | grep -E '([0-9]{1,3}\.){1,3}[0-9]{1,3}'
inet 192.168.200.10 netmask 255.255.255.0 broadcast 192.168.200.255
RX packets 23315 bytes 1903937 (1.8 MiB)
TX packets 17996 bytes 4077053 (3.8 MiB)
[root@localhost ~]# ifconfig ens33 | awk '/ inet /{print $2}'
192.168.200.10
nginx正则及location匹配
- nginx location匹配
- ^~:对个后续正则表达式标识匹配
- =:精准匹配
- ~:区分大小匹配
- ~*:不区分大小匹配
- !~:去区分大小的匹配取非
- !~*:对不区分大小的匹配取非
- /:通用
- 正则表达式补充
- *?:重复前面的字符0次或多次
- +?:重复前面的字符一次或多次
- ??:重复前面的字符0次或一次
- {n,m}?:重复前面的字符n次到m次
- {n,}?:重复前面的字符n次以上
- nginx location应用规则
- location:用于匹配相应的路径,进行控制访问或者反向代理。
- 位置:配置文件/usr/local/nginx/conf/nginx.conf的http项中的server项里。
- 用处:server项用于区分不同站点的监听地址、端口号和域名以及相关的站点目录
- 分类:
精准匹配:location = / {…}
正则匹配:location ~ / {…}(匹配即停止)
一般匹配:location / {…}(遵循最长匹配原则) - location 优先级
1.首先精确匹配=
2.其次前缀匹配^~
3.其次是按文件中顺序的正则匹配或*
4.然后匹配不带任何修饰的前缀匹配
5.最后是交给/ 通用匹配
location =>location 完整路径>location ^~ 路径>location , 正则顺序>location 部分起始路径>location /* - 实用建议规则
- 一个网站,至少有三个匹配规则定义
第一个必选规则
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
可以是一个静态首页,也可以直接转发给后端应用服务器
location = / {
proxy_pass http://tomcat_server/;
}
第二个必选规则
处理静态文件请求,这是nginx作为http服务器的强项,有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* .(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
第三个规则
通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求
location / {
proxy_pass http://tomcat_server;
}
- nginx rewrite规则
- 是使用nginx的全局变量或者子集设置的变量,结合正则表达式,来对URL重定向。
- 位置:server{}里的location{}里的if{}判断中
- 例如:http://www.lisi.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写
- 语法:rewrite 正则表达式 更换目标 【标志位】
- 执行顺序:执行server块中的rewrite指令----执行location匹配----执行选定的location中的rewrite指令,如果未找到循环十次返回500==内部错误
- flag标志位
- last:相当于Apache的【L】标记,也就是默认
- break:匹配到本规则后,停止匹配后面规则
- redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址。
- permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
last一般写于server的if中,而break一般用于location中
- if判断:
- 语法:if(condition){...},对condition判断,若真则执行
- -f和!-f:用来判断是否存在文件
- -d和!-d:用来判断是否存在目录
- -e和!-e:用来判断是否存在文件或目录
- -x和!-x:用来判断是否可执行