六周第一次课(3月12日)

9.1 正则介绍_grep上

9.2 grep中

9.3 grep下

扩展

把一个目录下,过滤所有*.php文档中含有eval的行

grep -r --include="*.php" 'eval' /data/




9.1 正则介绍_grep(上)


介绍

blob.png

本章将要学习 grep/egrep、sed、awk

egrep是grep升级版

blob.png

blob.png

test1
mkdir grep
cd grep/
cp /etc/passwd .
ls
asswd
grep 'nologin' passwd

blob.png

grep自带颜色高亮显示 

which grep可以看出高亮选项

grep -c 
#行数
grep -c 'nologin' passwd 
15
grep -n 
#行号
grep -n 'nologin' passwd

blob.png

grep -i
#不区分大小写 (如果不加-i,有大写的一行会被剥掉)

blob.png

grep -v 'nologin' passwd 
#取反
#意思就是把除了nologin之外的行过滤出来

blob.png

grep -r 
#遍历所有子目录

blob.png

# -A 后面跟数字,过滤出符合要求的行及下面n行
grep -nA2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/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
# -B 同上,过滤出符合要求的行以及上面n行
grep -nB2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
--
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
# -C 同上,同时过滤出符合要求的行以及上下各n行
grep -nC2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
8-halt:x:7:0:halt:/sbin:/sbin/halt
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



9.2 grep(中)


blob.png

grep '[0-9]' passwd  
#[n-n]里面的数字是一个范围值,'[0-9]'代表0-9其中一个字符。

blob.png


grep -v '[0-9]' passwd

那-v就是相反效果了,就是过滤没有[0-9]的值。意思就是,带数字的都不要。

grep -n '^高亮' passwd

^表示以什么开头。

把以#开头的行过滤出来。

grep -v '^#高亮' passwd

把不以#开头的行过滤出来。

#vi inittab

在11行任意输入纯字母参数。

      1 # inittab is no longer used when using systemd.
      2 #
      3 # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
      4 #
      5 # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
      6 #
      7 # systemd uses 'targets' instead of runlevels. By default, there are two main targets:
      8 #
      9 # multi-user.target: analogous to runlevel 3
     10 # graphical.target: analogous to runlevel 5
     11 asdkle
     12 # To view current default target, run:
     13 # systemctl get-default
     14 #
     15 # To set a default target, run:
     16 # systemctl set-default TARGET.target
     17 #
grep -nv '^#' inittab 
11:asdkle

第11行没有以#开头 所以被过滤出来。

# vi inittab

第十行增加数字加字母,第十五行添加纯数字

blob.png


注意,[^]里面的^代表非,反义,取反的意思。例如[^0-9]代表非0-9,也算是非数字的意思。

但是,如果^[^0-9],[]外的^代表以xxx(具体看^后面参数)开头,例如这里^[^0-9]就是以非数字开头的意思。

grep '[^0-9]' inittab

过滤打印非数字的信息,注意:如果后面带有字母的参数,此条件会成立,如果一行只是纯数字,没有带任何字母或其他标点符号,则不成立。

blob.png


grep -nv '[^0-9]' inittab 
15:22222222222

过滤非非数字的信息,-v非,[^]非负负得正,所以意思就是过滤数字的信息。红色代表符合条件,白色表示不符合条件。

grep '^[^0-9]' inittab

过滤打印以非数字开头的信息。

blob.png

grep -nv ^'[^0-9]' inittab 
10:111aaa
15:22222222222

过滤打印以数字开头的信息。


总结:

取反,

例如 [^0-9]  那就是非数字(包括字母+特殊符号)

例如[^a-zA-Z] 那就是非字母(包括数字+特殊符号)

例如[^0-9a-zA-Z]那就是非数字字母(特殊符号)

[^]  匹配非方括号里面的内容。就是:只要不是方括号里面的内容都打印出来。

^[^] 匹配非方括号里面的内容开头的所有字符。 只要不是方括号里面的内容所开头的,都打印出来。



9.3 grep(下)


blob.png


'r.o'表示把r与o之间有一个任意字符的行过滤出来。

.表示任意一个字符,包括标点符号,数字和字母.

grep 'r.o' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

添加几行r.o相关的字符。

#vi passwd

blob.png

'o*o'   *左边的字符重复0-n次,*的右边表示与结尾,也是o 前后匹配的。

grep 'o*o' 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
123:rao
456:r>o
132:r1o
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
# vi passwd

blob.png


'.*'任意一个任意字符

blob.png

例如 'aming.*bash' 

grep 'aming.*bash' passwd 
aming:x:1000:1000::/home/aming:/bin/bash

blob.png

grep '{2}'    
#不成立
grep 'o{2}'    
#不成立。如果用#egrep 'o{2}' 则成立。或者用#grep  -E 'o{2}'。 -E代表egrep.
grep 'o\{2\}'   
# 成立,\脱义,此参数表示过滤打印出现两次o的信息。

blob.png

egrep 'o{2}' passwd

与#grep 'o\{2\}'用法一样。

blob.png

'o+o'   +左边的字符重复1-n次,+的右边表示与结尾

grep 'o\+o' passwd
egrep 'o+o' passwd

结果与上述*实验结果差不多。


+前后不一定都匹配。例如“o+t”

[root@centos7 grep]# grep 'o\+t' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
123:rooot

过滤打印t或者ot的结果。

egrep 'o?t' passwd

blob.png

grep -E 'root|nologin' passwd

blob.png

可以匹配多个或者条件。如果加-i 可以不区分大小写,筛选范围会增大。

grep -E 'root|bus|997' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin

则表示一对oo出现2次,相当于o的2的倍数。如此类推。

egrep '(oo){2}' passwd

blob.png