grep
正则表达式分类:
1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)
2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)
3、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)
| 参数 | 说明 |
|---|---|
| -v | 排除匹配结果 |
| -n | 显示匹配行与行号 |
| -i | 不区分大小写 |
| -c | 只统计匹配的行数 |
| -E | 使用egrep命令 |
| --color=auto | 给过滤结果添加颜色 |
| -w | 只匹配过滤的单词 |
| -o | 只输出匹配的内容 |
| -l | 只输出匹配内容的文件名称 |
查找内容
[root@localhost ~]# cat a.txt
hello world
Hello World
[root@localhost ~]# grep 'hello' a.txt
hello world
忽略大小写
[root@localhost ~]# grep -i 'hello' a.txt
hello world
Hello World
显示行号
[root@localhost ~]# grep -in 'hello' a.txt
1:hello world
2:Hello World
统计匹配的总行数
[root@localhost ~]# grep -inc 'hello' a.txt
2
匹配空行
[root@localhost ~]# cat a.txt
hello world
Hello World
World
[root@localhost ~]# grep -n '^$' a.txt
2:
4:
匹配空行以外的
[root@localhost ~]# grep -n '^$' a.txt -v
1:hello world
3:Hello World
5:World
实例:匹配mysql配置文件非注释内容
[root@localhost ~]# grep -v '^#' /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
再去除空行
[root@localhost ~]# grep -v '^#' /etc/my.cnf | grep -v '^$'
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
显示匹配的文件名称
[root@localhost ~]# grep '^root' /etc/passwd a.txt
/etc/passwd:root:x:0:0:root:/root:/bin/bash
a.txt:root
[root@localhost ~]# grep '^root' /etc/passwd a.txt -l
/etc/passwd
a.txt
查询所有不可登录的用户 /sbin/nologin
[root@localhost ~]# grep -n '/sbin/nologin$' /etc/passwd
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
18:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
21:saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
22:nginx:x:996:995:Nginx web server:/var/lib/nginx:/sbin/nologin
只输出匹配的内容-o
[root@localhost ~]# grep -n '/sbin/nologin$' /etc/passwd -o
2:/sbin/nologin
3:/sbin/nologin
4:/sbin/nologin
5:/sbin/nologin
9:/sbin/nologin
10:/sbin/nologin
11:/sbin/nologin
12:/sbin/nologin
13:/sbin/nologin
14:/sbin/nologin
15:/sbin/nologin
16:/sbin/nologin
17:/sbin/nologin
18:/sbin/nologin
19:/sbin/nologin
21:/sbin/nologin
22:/sbin/nologin
匹配IP地址
[root@localhost ~]# grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /var/log/nginx/access.log -o
192.168.248.90
192.168.248.90
192.168.248.90
192.168.248.90
192.168.101.28
192.168.248.90
192.168.101.28
192.168.248.90
192.168.101.28
192.168.248.90
192.168.248.90
192.168.248.90
192.168.101.28
扩展正则表达式
扩展的正则表达式 'PATTERN':
egrep 使用扩展正则表达式来构建模式, 相当于grep -E
| 正则表达式 | 描 述 | 示 例 |
|---|---|---|
| . | 匹配任意单个字符 | hack. 匹配hackl和hackm,但是不能匹配hackll,hack |
| [] | 匹配包含在[字符]之中的任意一个字符 | coo[kl] 匹配cool或cook |
| [^] | 匹配除[字符]之外的任意一个字符 | 9[^01] 匹配93,92 但是不能匹配91, 90 |
| [-] | 匹配[]中指定的范围中的任意一个字符 | [0-3] 匹配1~3任意一个数字 |
| 锚钉行的开头 | ^diguo 匹配以diguo开头的行 | |
| $ | 锚钉行的末尾 | diguo$ 匹配以diguo结尾的行 |
| <char | 锚钉单词的开头 | <char 匹配以char开头的单词 |
| char> | 锚钉单词的结尾 | char> 匹配以char结尾的单词 |
| * | 匹配之前的项目0次或多次 | co*l 等于 cl, col, cooooool 等 |
| ? | 匹配之前的项目0次或1次 | x?y, 等于 xy, x |
| + | 匹配之前的项目1次或多次 | rollno-9+ 匹配rollno-99, rollno-9 等 但是不能匹配rollno- |
| () | 创建一个用于匹配的字符串 | ma(tri)?x 匹配max或者matrix |
| {m} | 匹配之前的项目m次 | [0-9]{3} 匹配任意一个三位数, [0-9][0-9][0-9]也可以 |
| {m,} | 匹配之前的项目至少m次 | [0-9]{2,} 匹配一个2位数字或 更多位数字 |
| {m,n} | 匹配之前的项目至少m次,至多n次 | [0-9]{2,3} 匹配一个2位数字,或3位数字 |
| (m|n) | 或者, 匹配|两边的任意一项 | Oct (1st|2nd) 匹配 Oct 1st 或者 Oct 2nd |
| / | 转义字符, 将上面的特殊字符进行转义 | a.b匹配的是a.b, 但不能匹配ajb, 通过在.之前加上了, 从而忽略了.的特殊意义 |
| POSIX字符类 | meta sequence [:xxxx:] | 可以匹配到常用的字符范围 |
| 正则表达式 | 描 述 | 示 例 |
| [:alnum:] | 字母与数字字符 | [[:alnum:]]+ 一个或多个数字或字母 |
| [:alpha:] | 字母字符(包括大写小写字母) | [[:alpha:]]{4} 4个不区分大小写字母 |
| [:blank:] | 空格与制表符 | [[:blank:]]* 0个或多个空格或制表符 |
| [:digit:] | 数字字符 | [[:digit:]]? 0个或1个数字 |
| [:lower:] | 小写字母 | [[:lower:]]{5,} 至少5个小写字母组成的字串 |
| [:upper:] | 大写字母 | [[:upper:]]{0,5} 至多5个大写字母组成的字串 |
| [:punct:] | 标点符号 | [[:punct:]] 一个标点符号 |
| [:space:] | 包括换行符,回车符,在内的所有空白字符 | [[:space:]]* 0或多个任意空白字符 |
分组
[root@localhost ~]# grep -E 'st(ar|ba)t' a.txt
start
stbat
分组后引用
\1 表示左边开始,第一个括号中模式所匹配到的字符
\2 第二个括号中模式所匹配到的字符
[root@localhost ~]# grep -E '(r..t).*\1' /etc/passwd
root:x:0:0:root:/root:/bin/bash
重复次数
[root@localhost ~]# cat a.txt
hello world
helllllloworld
192.168.183.15
重复前一个字符2次
[root@localhost ~]# grep -E 'l{2}' a.txt
hello world
helllllloworld
重复前一组字符1次
[root@localhost ~]# grep -E '(ll){1}' a.txt
hello world
helllllloworld
重复前一个字符至少3次
[root@localhost ~]# grep -E 'l{3,}' a.txt
helllllloworld
重复前一个字符2到3次
[root@localhost ~]# grep -E 'l{2,3}' a.txt
hello world
helllllloworld
单词铆钉
[root@localhost ~]# grep '^zhangsan' a.txt
zhangsan
zhangsan001
[root@localhost ~]# grep '^zhangsan\>' a.txt
zhangsan
匹配UID或GID 2位到三位的
[root@localhost ~]# grep -E '\<[0-9]{2,3}\>' /etc/passwd
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:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
saslauth:x:997:76:Saslauthd user:/run/saslauthd:/sbin/nologin
nginx:x:996:995:Nginx web server:/var/lib/nginx:/sbin/nologin