目录
一、正则表达式是什么?
按照某种正确的规则,将字母,数字,特殊符号组成一个公式,用来表达某个意思。
二、元字符
-
^ 表示以什么开头
可以用来把无效行给去掉
cat /etc/ssh/sshd_config |egrep -v -n "^$|^#"
- $表示以什么结尾
- ^$ 代表空行
^huawei$ 表示一行中只有huawei这个词的
- ? 表示0个或者1个前面的字符:
echo "abc ac abbc"|egrep "ab?c"
只有abc ac满足要求
- + 表示1个或者多个前面的字符:
echo "abc abbbc ac"|egrep "ab+c"
只有abc abbbc 满足ab+c
- 使用{}指定出现次数:
ab{4}c就是规定了b只能出现4次
ab{4,}c规定b出现4次以上
ab{4,8}c规定b出现4-8次之间
ab{,8}c规定出现0-8次之间
(ab){,8}c规定ab出现的次数为0-8次之间
- * 表示0个或者多个前面的字符:
echo "abc abbbc ac"|egrep "ab*c"
abc abbbc ac都满足ab*c*hello* #表示包含hello的单词
- . 表示一个任意字符:
[root@sc-host ~]# cat /etc/passwd |egrep "^n...:"
ncl2:x:9005:9005::/home/ncl2:/bin/bash
ncl3:x:9006:9006::/home/ncl3:/bin/bash
ncl4:x:9007:9007::/home/ncl4:/bin/bash
ncl5:x:9008:9008::/home/ncl5:/bin/bash
- .*任意个任意字符
- [ ]组合
[0-9]取0-9之间的任意一个字符
[abc]取abc之中的任意一个字符
[^a-f]不是a-f之间的字符
- 表示单词以什么开头:
\<chen 表示单词以chen开头
\bchen也表示单词以chen开头
- 表示单词以什么结尾:
jin\>表示单词以jin结尾
jin\b表示单词以jin结尾
- 表示一个单词
\<chenjinjin\>
- 表示长度在16-18的单词
\<[a-Z]{16,18}\>
- \w 表示下划线,字母,数字
- \W 表示非下划线,数字,字母,其实就是特殊符号
- \s 表示空白
- |表示或
三、一些常见的正则表达式
1、网址的正则表达式:
[a-z]+://[0-Z]+\.[0-Z]+\.[0-Z]+
2、邮箱的正则表达式:
[0-Z]+@[0-Z]+\.[0-Z]+
3、IP地址的正则表达式:
最简单的表示方法(999.999.999.999范围超过了IP地址范围):
([0-9]{1,3}\.){3}([0-9]{1,3})
仅仅表示所有IP地址(255.255.255.255):
(([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
A类地址(1~127):
([1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-7])\.(([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
B类地址(128~191):
(12[89]|1[3-8][0-9]|19[0-1])\.(([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
C类地址(192~223):
(19[2-9]|2[0-1][0-9]|22[0-3])\.(([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
4、时间的正则表达式:
首先需要确定时间的表达格式:18/Oct/2022:09:55:53,然后就是找规律
2022年10月1日到10月31日的正则
([1-9]|[1-2][0-9]|3[01])/Oct/2022
2022年10月18日9点到10月18日21点的正则
18/Oct/2022:(09|1[0-9]|2[01])
2022年10月18日9点01到10月18日点9点59的正则
18/Oct/2022:09:(0[1-9]|[1-5][0-9])
2022年10月18日9点59分00秒到10月18日点9点59分59秒的正则
18/Oct/2022:09:59:([0-5][0-9])
其实截取时间的话,使用awk命令会更简单:
用法:格式: '/时间/,/时间/' 表示从什么时候到什么时候,不包括端点显示25/Oct/2022:11:43:06到25/Oct/2022:11:44:32日志
sed -n "/25\/Oct\/2022:11:43:06/,/25\/Oct\/2022:11:44:32/p" access.log正则表达式做法
sen -n '/25\/Oct\/2022:11:4[3,4]/p' access.log
5、总结
其实写正则表达式的方法就是找规律,相信如果你多加练习,肯定也能掌握其中精髓