本文共 3403 字,大约阅读时间需要 11 分钟。
扩展:
把一个目录下,过滤所有*.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
-n 显示行号
2. grep -n 过滤出含有关键词行打印到屏幕,并标记行号 :
grep -n '关键词' 文件名
[root@hao-01 grep]#grep -n 'nologin' passwd
-i 不区分大小写
3. grep -ni 关键词行打印到屏幕,并标记行号同时关键词不区分大小写!
grep -ni '关键词' 文件名 (文件内容中,关键词含有大小写字母都可以筛选出来)
[root@hao-01 grep]#grep -ni 'nologin' passwd
-v 取反
4. grep -vni 不包含关键词行,关键词也不区分大小写,并标记行号打印到屏幕!
grep -vni '关键词' 文件名
[root@hao-01 grep]#grep -vni 'nologin' passwd
-r 遍历所有子目录
5. 筛选出/etc下, 含有关键词行的子目录并遍历(紫色标记的) :
grep -r '关键词' 指定目录
[root@hao-01 grep]#grep -r 'nologin' /etc/
-A 后面跟数字,过滤出符合要求的行以及下面n行
6. grep -nA任意数字
过滤出含有关键词行,同时列出关键词行 下面的2行 :
grep -nA2 '关键词' 文件名
[root@hao-01 grep]#grep -nA2 'root' passwd
-B 同上,过滤出符合要求的行以及上面n行
7. grep -nB任意数字
过滤出含有关键词行,同时列出关键词行 上面的2行 :
grep -nB2 '关键词' 文件名
[root@hao-01 grep]#grep -nB2 'root' passwd
-C 同上,同时过滤出符合要求的行以及上下各n行
8. grep -nC任意数字
过滤出含有关键词行,同时列出关键词行 上面和下面各2行 :
grep -nC2 '关键词' 文件名
[root@hao-01 grep]#grep -nC2 'root' passwd
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
2. 匹配出 含有关键词的行(*左边字符可重复任意次):
[root@hao-01 grep]#grep 'o*o' passwd
3. 匹配出 所有字符所有行都匹配了:
[root@hao-01 grep]#grep '.*' passwd
4. 匹配出 包含关键词.*关键词行:
grep '关键词.*关键词' 文件名
[root@hao-01 grep]#grep 'hao.*bash' passwd
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
7. +(加号)左边关键词o 可1次或多次重复,后面匹配关键词t
[root@hao-01 grep]#egrep 'o+t' passwd
8. ?前面字符的重复次数为0或1,
[root@hao-01 grep]#egrep 'o?2o' passwd
9. | 或者匹配出包含关键词
(或者)匹配出关键词
(或者)匹配出包含关键词的行!
[root@hao-01 grep]#grep -E 'root|nologin|hao' passwd
总结:
. | 任意一个字符 |
* | 0个或多个*号前面的字符 |
.* | 通配 所有的都匹配,没有字符也匹配 |
{} | 花括号里的数字,表示{}前面的字符范围,前面字符可以用()括起来 |
+ | 一个或多个加号前面的字符 |
? | 0个或1个 问号前面的字符 |
| | 表示 或者,意思 |