1.1 字符
1.1.1 特定字符:''
蕴含"root"的字符
[[email protected] ~]$ grep 'root' passwd root:x:0:0:root:/root:/bin/bash
1.1.2 范畴字符:[]
蕴含数字+大小写字母的字符
grep '[0-9a-zA-Z]' passwd
1.1.3 任意字符 .
[[email protected] ~]$ grep '.' passwd 会全副过滤出来
1.1.4 取反 [^]
[[email protected] ~]$ grep '[^a-zA-Z0-9:/-]' passwd 不蕴含大小写字母、不蕴含数字、不蕴含冒号、不蕴含斜杠、不蕴含横杠的后果。
1.2 边界字符^$
1.2.1 头字符^和尾字符$
以ftp结尾
[[email protected] ~]$ grep '^ftp' passwd ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
以false结尾
[[email protected] ~]$ grep 'false$' passwd mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
空白行: '^$'
[[email protected] ~]$ grep '^$' passwd
1.3 元字符\w\W
1.3.1 字母数字下划线\w
相当于 grep '[a-zA-Z0-9_]' passwd
[[email protected] ~]$ grep '\w' passwd
1.3.1 非字母数字下划线\W
相当于 grep '[^a-zA-Z0-9_]' passwd
[[email protected] ~]$ grep '\W' passwd
1.4 单词宰割元字符\b
[[email protected] ~]$ grep '\bx\b' passwd // 这样就不会过滤出这样的行了:/var/spool/postfix:/sbin/nologin
1.5 反复字符示意
1.5.1 字符串
一般字符串,比方:'root', 'r..t'等;
要过滤两个数字相连的,谬误形式: [[email protected] ~]$ grep '0-9' passwd
正确形式:加上单词宰割字符
[[email protected] ~]$ grep '\b[0-9][0-9]\b' passwd
1.5.2 反复字符示意
- * 零次或屡次
- + 一次或屡次
- ?零次或一次
创立一个文本文件:test.txt
niewjhao helloni hao helloniee hao helloniewjnice niewjabcnilsonniewjniewjniewjniniiinininininininijksdf;ni;
1.5.3 单个字符反复
#1. 蕴含"nie",且"e"有0个或者多个[[email protected] ~]$ grep 'nie*' test.txt niewjhao helloni hao helloniee hao helloniewjnice niewjabcnilsonniewjniewjniewjniniiinininininininij;ni#2. 蕴含"nie",且"e"有1个或者多个,(留神:"+"前要加转义字符\)[[email protected] ~]$ grep 'nie\+' test.txt niewjhao helloniee hao helloniewjnice niewjniewjniewjniewj#3. 蕴含"nie",且"e"有0个或者1个(留神:"?"前要加转义字符\)[[email protected] ~]$ grep 'nie\?' test.txt niewjhao helloni hao helloniee hao helloniewjnice niewjabcnilsonniewjniewjniewjniniiinininininininij;ni
- (留神:"?"前要加转义字符)
- (留神:"+"前要加转义字符)
1.5.4 一组字符反复
#1. 蕴含"nie",且"nie"有0个或者多个[[email protected] ~]$ grep '\(nie\)*' test.txt // 略。因为0个会匹配到空行和所有#2. 蕴含"nie",且"nie"有1个或者多个[[email protected] ~]$ grep '\(nie\)\+' test.txt niewjhao helloniee hao helloniewjnice niewjniewjniewjniewj#3. 蕴含"nie",且"nie"有0个或者1个[[email protected] ~]$ grep '\(nie\)\?' test.txt // 略。因为0个会匹配到空行和所有
1.5.5 反复次数限度{n, m}
- * {0,}
- + {1,}
- ? {0, 1}
# "niewj"这个字符串呈现1次到两次[[email protected] ~]$ grep '\(niewj\)\{1,2\}' test.txt niewjhao helloniewjnice niewjniewjniewjniewj
这里会发现"niewjniewjniewj"其实是3次,然而也列出来了,这就是正则的"贪心匹配模式",会进行屡次匹配。
1.5.6 任意字符串留神贪心模式
# 如果咱们要找的是"niewj",上面不对,因为其匹配的其实是:"niewj:x:1000:1000::/home/niewj"[[email protected] ~]$ grep 'n.*j' passwd niewj:x:1000:1000::/home/niewj:/bin/bash# 上面匹配到的才是正确的:2个"niewj"[[email protected] ~]$ grep '\bn[a-zA-Z]*j\b' passwd niewj:x:1000:1000::/home/niewj:/bin/bash# 上面这两个也能够:# grep 'n[a-zA-Z]*j' passwd# grep 'n\w*j' passwd
grep 'n.*j' passwd
匹配要留神贪心模式,如下面要获得"niewj"不能用".*"
1.6 逻辑或匹配|
文本中蕴含"bin/false"的行,也有蕴含"bin/sync"的行,如果两者都须要,则应用逻辑或"|"
[[email protected] ~]$ grep 'bin/\(false\|sync\)' passwd sync:x:5:0:sync:/sbin:/bin/syncmysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
下面例子表白的其实是: "bin/(false|sync)" 因为括号和"|"都须要本义,所以都加了转义字符。
1.7 几个案例
1.7.1 匹配4-10位的QQ号
测试数据:qq.txt
asdkfjjd;k 578374
174375893
274958
ad8485
883a8585
12111319890202124X
123456789012345
123456789012345x
12345678901234x
345679876556890967
679
根本规定:
- 0-9
- 4-10位
- 数字结尾数字结尾
所以是:grep '^[0-9]\{4,10\}$' qq.txt
[[email protected] ~]$ grep '^[0-9]\{4,10\}$' qq.txt 174375893274958
1.7.2 匹配身份证号(15-18且反对X尾)
根本规定:
- 第一位不能是0
- 两头是13-16位数字
- 尾数是数字或"X"或"x"
[[email protected] ~]$ grep '^[1-9][0-9]\{13,16\}[0-9xX]$' qq.txt 12111319890202124X123456789012345123456789012345x12345678901234x345679876556890967
1.7.3 匹配明码规定
数字、字母、下划线组成、大于8位
[[email protected] ~]$ grep '^\w\{8,\}$' qq.txt 174375893883a858512111319890202124X123456789012345123456789012345x12345678901234x345679876556890967