正则表达式
正则介绍
什么是正则
正则就是一串有规律的字符串
掌握好正则对于编写shell脚本有很大的帮助
各种编辑语言中都有正则,原理是一样的。
grep命令
命令格式:grep [-cinvrABC] ‘word’ filename
常用选项
-c 表示行数
-I 表示忽不区分大小写
-n 表示输出符合要求的行及其行号
-v 表示取反 反转查找
-r 遍历子目录下面文件所有文件
-A 后面跟数字,过滤出符合要求的行以及下面的行
-B 后面跟数字 过滤出符合要求的行以及上面n行
-C 后面跟数字 同时过滤出符合要求的行以及上下各n行
实验:创建grep目录 把/etc/passwd 文件拷贝过来
[root@qklinux-01 ~]# mkdir grep
[root@qklinux-01 ~]# cd grep
[root@qklinux-01 grep]# cp /etc/passwd .
[root@qklinux-01 grep]# ls
passwd
[root@qklinux-01 grep]# pwd
/root/grep
然后过滤文件里nologin字符
我们可以看到nologin过滤完后自动标红 这是因为在centos7中grep -–color=auto
[root@qklinux-01 grep]# which grep
alias grep=‘grep --color=auto’
/usr/bin/grep
grep –c 查看行数
[root@qklinux-01 grep]# grep -c 'nologin' passwd
16
grep –n 显示行号
[root@qklinux-01 grep]# grep -n 'nologin' 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
24:user4:x:1006:1005::/home/qkai111:/sbin/nologin
grep –i不区分大小写
grep –v取反
[root@qklinux-01 grep]# grep -vni 'nologin' passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
20:qkai:x:1000:1005::/home/qkai:/bin/bash
21:user1:x:1001:1001::/home/user1:/bin/bash
22:user2:x:1002:1002::/home/user2:/bin/bash
23:user3:x:1004:1005::/home/user3:/bin/bash
25:user5:x:1007:1007::/home/user5:/bin/bash
26:user6:x:1008:1010::/home/user6:/bin/bash
grep –r遍历子目录下面文件所有文件
列出etc下包含root的所有文件
-A2 把包含root的行 以及下面的两行都打印出来
-B2把包含root的行 以及这行上面的两行都打印出来
-C2把包含root的行以及上下两行都打印出来
grep/egrep的用法示例
grep ‘[0-9]’ 查看一个文件里0-9的数字 其中[]方括号表示任意一个字符
grep –v取反 列出不包含数字的
[root@qklinux-01 grep]# grep -v '[0-9]' /etc/inittab
#inittab is no longer used when using systemd.
#
#ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
#Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
#systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
#
#To view current default target, run:
#systemctl get-default
把不以#开头的过滤掉
[root@qklinux-01 grep]# grep -nv '^#' inittab
14:sdisiaihcasb
过滤非0-9开头的数字行
[root@qklinux-01 grep]# grep '^[^0-9]' inittab
#inittab is no longer used when using systemd.
#
#ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
#Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
aaaa
#
#systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
#multi-user.target: analogous to runlevel 3
#graphical.target: analogous to runlevel 5
#
#To view current default target, run:
#systemctl get-default
sdisiaihcasb
#
#To set a default target, run:
#systemctl set-default TARGET.target
#
取反行
[root@qklinux-01 grep]# grep -vn '^[^0-9]' inittab
9:1111111
^符号放在方括号就是方括号里面内容的反义 放在括号外就是以什么开头
过滤出任意个字符。 点代表任意一个字符
[root@qklinux-01 grep]# grep 'r.o' passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
*代表这个符号前面那个字符有零个或者多个
*所有都匹配.同时使用
指定要过滤的字符出现次数
{}花括号表示一个范围 要加上脱义字符\ o{2}表示两个连续的oo显示出来
#grep ‘o{2}’ passwd
#egrep ‘o{2}’ passwd
#grep -E ‘o{2}’ passwd
可以看到这三个输出结果都是一样的
+过滤一次或多次指定的字符 两种方法 grep egrep
[root@qklinux-01 grep]# grep 'o\+o' passwd
root:x:0:0:root:/root:/bin/bash
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
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@qklinux-01 grep]# egrep 'o+o' passwd
root:x:0:0:root:/root:/bin/bash
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
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
?表示?前面字符重复次数 是零或者1
匹配过滤出root或者nologin 用|
#grep -E 'root|nologin' passwd
总结
. 表示任意一个字符
星号表示前面字符零个或多个
{}表示一个范围 花括号前面的字符范围要用小括号
+表示一个或多个+前面的字符
?表示?前面的字符幽灵个或1个
|表示或者
直播扩展
简易审计系统
http://www.68idc.cn/help/server/linux/2014042190951.html
read命令解释
http://blog.lishiming.net/?p=484
正则表达式几个核心关键词
. 点表示任意个字符
*表示表示匹配前一个字符大于等于0次
+表示匹配前面一个字符大于等于1次
?表示匹配前一个字符0或1次
()表示是为了提取匹配的字符串
{}一般用来表示匹配的长度
|表示或者
[]表示在范围内选择其中一个[0-9] [a-z]
^在括号内表示取反 括号外表示从这里开始
$结束标记
\ 匹配后转义字符串
扩展正则 + ?(){} | 需要使用命令 grep -E或者egrep