三剑客(grep)篇

211 阅读5分钟

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