
正则表达式
目标:查找/取出/匹配 符合条件的某个字符或字符串
正则表达式学习方法:单个字符表示>>>字符串表示>>>表达式
正则单字符的表示方法
首先,把/etc/passwd复制到家目录下
1 | cp /etc/passwd ~/. |
特定字符
某个具体的字符,如:’1’,’a’
示例:
1 | grep '1' passwd |
范围内字符
- 数字字符
- 小写字符
- 大写字符
- 大小写字符
- 符号
- 反向字符
单个字符 []
数字字符
[0-9],[123] (注意:只是范围内的一个字符)
示例:
1 | grep '[0-9]' passwd |
小写字符
[a-z]
示例:
1 | grep '[a-z]' passwd |
大写字符
[A-Z]
示例:
1 | grep '[A-Z]' passwd |
大小写字符
[a-zA-Z]
示例:
1 | grep '[a-zA-Z]' passwd |
符号
[,:_]
示例:
1 | grep '[,:_]' passwd |
反向字符
[^0-9]
示例:
1 | grep '[^0-5]' passwd |
任意字符
- 一个点:’.’ (代表任何一个字符)
- 注意*:’[.]’ 与 ‘.‘ 的效果是一样的
边界字符
- 头字符
- 尾字符
头尾字符
^:^root (注意与[^]的区别)
示例:
1 | grep '^root' passwd |
$:false$
示例:
1 | grep 'false$' passwd |
空行的表示:^$
首先在家目录下创建一个a.txt文件
1 | touch a.txt |
输入以下内容:
1 | hello world |
示例:
1 | grep '^$' a.txt |
元字符
\w:匹配任何字类字符,包括下划线([A-Za-z0-9_])
示例:
1 | grep '\w' a.txt |
\W:匹配任何非字类字符([^A-Za-z0-9_])
示例:
1 | grep '\W' a.txt |
\b:代表单词的分隔
示例:
1 | grep '\bx\b' passwd |
字符表达式的字符组合
字符串
‘root’ ‘1000’ ‘a..c’
‘[A-Z][a-z]’:大写字母与小写字母的组合
示例:
1 | grep '[A-Z][a-z]' passwd |
‘[0-9][0-9]’:数字与数字的组合
示例:
1 | grep '[0-9][0-9]' passwd |
这里会有一个问题:会匹配到两位以及两位数以上的数据行
解决办法:
grep ‘\b[0-9][0-9]\b’ passwd
其实用久了我们会发现,上面的这种组合方式非常的繁琐、不方便
有没有更好的办法呢?
当然有!
重复
- *:
零次或多次匹配前面的字符或表达式 - +:
一次或多次匹配前面的字符或表达式 - ?:
零次或一次匹配前面的字符或表达式
首先创建一个测试文件test.txt
touch test.txt
填入以下内容
ab
ababab
abbbbbbbbbb
bbbbbbbbbbb
acccccccc
+ab+ab+
匹配单个字符
示例:
grep ‘ab*’ test.txt
grep ‘ab+’ test.txt
grep ‘ab?’ test.txt
自己可以尝试一下这三个有什么不同之处
下面是我做的测试,高亮的地方就是匹配到的字符
1 | grep 'ab*' test.txt |
abababababbbbbbbbbbacccccccc
+ab+ab+
1 | grep 'ab+' test.txt |
+
ab+ab+
嘿,是不是发现grep 'ab+' test.txt有问题啊
是的,这个+号需要转义一下,?也是同理
1 | grep 'ab\+' test.txt |
abababababbbbbbbbbb
+ab+ab+
1 | grep 'ab\?' test.txt |
abababababbbbbbbbbbacccccccc
+ab+ab+
匹配多个字符
如果想要匹配一整个字符呢?
可以用()括起来
示例:
1 | grep '\(ab\)*' test.txt |
结果:
ab
ababab
abbbbbbbbbbbbbbbbbbbbb
acccccccc
+
ab+ab+
是不是发现其中有空行的存在?
这是因为*包括匹配零次的结果
语句应该这样写:
1 | grep '\(ab\)\+' test.txt |
结果:
abababababbbbbbbbbb
+ab+ab+
重复特定次数
{n,m}:重复n到m次
比如{2,3},在grep中使用就是说匹配重复2次到3次的数据行
示例:
1 | grep '[0-9]\{2,3\}' passwd |
测试之后会发现确实是匹配到了2次到3次的数据行了,但是其中也包括了三次以上的数据行
这该如何解决呢?
没错,就是你想的那样
1 | grep '\b[0-9]\{2,3\}\b' passwd |
匹配任意字符串
.表示任何一个字符
示例:
1 | grep '^a.*' passwd |
这里请注意'^a.*b'与'^a..b'的区别
这个应该都明白吧?
哎,还是写出来吧…
示例:
1 | grep '^a.*b' test.txt |
结果:
abababababbbbbbbbbb
1 | grep '^a..b' test.txt |
结果:
ababababbbbbbbbbb
这次明白了吧…😓
逻辑表示
| : ‘bin/(bash|nologin)‘
示例:
1 | grep 'bin/\(bash\|nologin\)' passwd |
结果:
root:x:0:0:root:/root:/
bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
案例测试
案例一
匹配4-10位QQ号
首先创建一个qq.txt文件
可以填入随意的内容:
1 | 123 |
1 | grep '^[0-9]\{4,10\}' qq.txt |
案例二
匹配15位或18位的身份证号(支持带X)
1 | grep '^[0-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$' qq.txt |
案例三
匹配密码(由数字,26个字母和下划线组成)
1 | grep '^\w\+$' qq.txt |