扩展:

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

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

9.1 正则介绍_grep(上)

正则是什么?

• 正则就是一串有规律的字符串

• 掌握好正则对于编写shell脚本有很大帮助

• 各种编程语言中都有正则,原理是一样的

正则三剑客:grep/egrep、sed、awk

grep

跟下面的参数!

-c

过滤出的关键词 共有多少行数

-i

过滤出的关键词 不区分大小写

-n

过滤出的关键词 显示行号

-v

取反(非关键词行也列出来)

-r

遍历所有子目录(含有关键词行的子目录会紫色标记)

-A

-A任意数字(如3):过滤出关键词行和关键词下面任意数字行(如3行)

-B

-B任意数字(如3): 过滤出关键词行和关键词上面任意数字行(如3行)

-C

-B任意数字(如3):过滤出关键词行和关键词上下各任意数字行(如3行)

grep [-cinvABC] 'word' filename

-c   行数

-i   不区分大小写

-n   显示行号

-v   取反

-r   遍历所有子目录

-A   后面跟数字,过滤出符合要求的行以及下面n行

-B   同上,过滤出符合要求的行以及上面n行

-C   同上,同时过滤出符合要求的行以及上下各n行

1. 创建grep目录做测试:                

[root@hao-01 ~]#mkdir grep

2. 进入grep目录:                  

[root@hao-01 ~]#cd grep

3. 拷贝/etc/passwd文件到当前目录下做测试:

[root@hao-01 grep]#cp /etc/passwd .

-c   行数

1. grep -c 过滤出含有关键词行,统计共有多少?  

grep -c '关键词'  文件名

[root@hao-01 grep]#grep -c 'nologin' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_02

-n   显示行号

2. grep -n 过滤出含有关键词行打印到屏幕,并标记行号

grep -n '关键词'  文件名

[root@hao-01 grep]#grep -n 'nologin' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_03

-i   不区分大小写

3. grep -ni 关键词行打印到屏幕,并标记行号同时关键词不区分大小写

grep -ni '关键词'  文件名   (文件内容中,关键词含有大小写字母都可以筛选出来)

[root@hao-01 grep]#grep -ni 'nologin' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_grep_05

-v   取反

4. grep -vni 不包含关键词行,关键词也不区分大小写,并标记行号打印到屏幕!

grep -vni '关键词'  文件名

[root@hao-01 grep]#grep -vni 'nologin' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_07

-r   遍历所有子目录

5. 筛选出/etc下, 含有关键词行子目录遍历(紫色标记的) :

grep  -r  '关键词'  指定目录

[root@hao-01 grep]#grep -r 'nologin' /etc/

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_grep_09

-A   后面跟数字,过滤出符合要求的行以及下面n行

6. grep -nA任意数字

过滤出含有关键词行,同时列出关键词行 下面的2

grep -nA2 '关键词'  文件名

[root@hao-01 grep]#grep -nA2 'root' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_grep_11

-B   同上,过滤出符合要求的行以及上面n行

7. grep -nB任意数字

过滤出含有关键词行,同时列出关键词行 上面的2

grep -nB2 '关键词'  文件名

[root@hao-01 grep]#grep -nB2 'root' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_13

-C   同上,同时过滤出符合要求的行以及上下各n行

8. grep -nC任意数字

过滤出含有关键词行,同时列出关键词行 上面下面2

grep -nC2 '关键词'  文件名

[root@hao-01 grep]#grep -nC2 'root' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_15

9.2 grep(中)  

1. 过滤出 包含0-9数字的行:grep '[数字范围]' 文件名

[root@hao-01 grep]#grep '[0-9]' passwd

2. 过滤出 不包含0-9数字的行:grep -v '[数字范围]' 文件名

[root@hao-01 grep]#grep -v '[0-9]' passwd

^放在方括号里面方括号里面字符的反义(非)

^放在方括号外面方括号里面字符开头

3. 过滤出 #开头的行:grep -n '^#' 文件名

[root@hao-01 grep]#grep -n '^#' passwd

4. 过滤出 不以#开头的行:grep -nv '^#' 文件名

[root@hao-01 grep]#grep -nv '^#' passwd

5. 过滤出 含有非0-9数字行(纯数字行不会显示),非数字字符红色标记:

[root@hao-01 grep]#grep -n '[^0-9]' passwd

6. 过滤出 含有非a-z字母行(纯字母行不会显示),非字母字符红色标记:

[root@hao-01 grep]#grep -n '[^a-z]' passwd

7. 过滤出 不以0-9数字开头的行:

[root@hao-01 grep]#grep -n '^[^0-9]' passwd

8. 过滤出 0-9数字开头的行:

[root@hao-01 grep]#grep -nv '^[^0-9]' passwd

9. 过滤出 不以a-z字母开头的行:

[root@hao-01 grep]#grep -n '^[^a-z]' passwd

10. 过滤出 a-z字母开头的行:

[root@hao-01 grep]#grep -nv '^[^a-z]' passwd

9.3 grep(下)

1. 匹配出 含有关键词.关键词的行(. 表示任意的一个字符):

grep '关键词.关键词' 文件名

[root@hao-01 grep]#grep 'r.o' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_17

2. 匹配出  含有关键词的行(*左边字符可重复任意次):

[root@hao-01 grep]#grep 'o*o' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_grep_19

3. 匹配出 所有字符所有行都匹配了:

[root@hao-01 grep]#grep '.*' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_21

4. 匹配出 包含关键词.*关键词

grep '关键词.*关键词' 文件名

[root@hao-01 grep]#grep 'hao.*bash' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_23

5. {}里的数字,表示{}前面关键词的重复范围:

[root@hao-01 grep]#grep 'o\{2\}' passwd

或[root@hao-01 grep]#egrep 'o\{2\}' passwd

或[root@hao-01 grep]#grep -E 'o\{2\}' passwd

6. oo组合的2次重复,匹配出不少于4个o的行:

[root@hao-01 grep]#egrep '(oo){2}' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_25

7. +(加号)左边关键词o 可1次或多次重复,后面匹配关键词t

[root@hao-01 grep]#egrep 'o+t' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_27

8. 前面字符的重复次数为0或1,

[root@hao-01 grep]#egrep 'o?2o' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_grep_29

9. | 或者匹配出包含关键词

      (或者)匹配出关键词

      (或者)匹配出包含关键词的行

[root@hao-01 grep]#grep -E 'root|nologin|hao' passwd

9.1 正则介绍_grep(上);9.2 grep(中);9.3 grep(下)_正则_31

总结:

.  

任意一个字符

*  

0个或多个*号前面的字符

.*

  通配 所有的都匹配,没有字符也匹配

{}  

花括号里的数字,表示{}前面的字符范围,前面字符可以用()括起来

+

一个或多个加号前面的字符

?  

0个或1个 问号前面的字符

|  

表示 或者,意思