正则表达式

  • 概述:使用一组字符串来描述,匹配一系列符合某个句法规则的字符串。广泛适用于脚本编辑,文件编辑器如,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:用来判断是否可执行