正则表达式
正则表达式
https://blog.csdn.net/weixin_53496398/article/details/115706498
-
概述:使用一组字符串来描述,匹配一系列符合某个句法规则的字符串。广泛适用于脚本编辑,文件编辑器如,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:用来判断是否可执行
-