grep作为linux管理中常用的三大工具之一(grep、awk、sed),其功能十分强大,因此难以对其进行全面的使用介绍,因此本文只作为个人学习的笔记之用。
grep的用处:
在文本中匹配要查询的字符串,该字符串支持通配符和正则表达式,并且在文本中进行查找的时候是以行为单位的。给一个简单的用法:查询/etc/passwd文件中root字符串。
现有待查询的文本:
例子1:
grep 'from' -i -r -n
‘from’ 为需要查询的字符串;
-i 为在查询匹配时不区分字符串的大小写;
-r 为在查询时对指定的目录进行迭代查询(就是说会遍历目录下面的所有子目录中的文件),这里我们默认目录为当前路径‘.’ ;
-n 为返回查询结果时标注出匹配的字符串所在行的行号;
例子2:
-E 的使用。
扩展正则表达式。
使用-E时可以在查询时进行多个字符串的“或”条件的匹配。
grep -E 'import|from' -i -r -n
这里匹配的是‘import’或‘from’,一行中支付串只要匹配这两个中的一个即可。
例子3: (和第二个例子很相似)
-e 的使用。
使用多字符串匹配。
使用-e时可以在查询时进行多个字符串的“或”条件的匹配。
grep -e 'import' -e 'from' -i -r -n
这里匹配的是‘import’或‘from’,一行中支付串只要匹配这两个中的一个即可。
例子4:
-m 的使用。
使用-m时在其后面需要加数字,表示为每个文件最多可以匹配的行数。
grep -m 1 -e 'import' -e 'from' -i -r -n
第4个例子可以和第3个、第二个例子比较来看,可以看到,每个文本中只匹配了一行。
例子5:
-w 的使用。
表示为待匹配的字符串应以独立形式存在,比如xxx import yyyy中的import就是独立存在,fun(import)和__import__就不是独立存在。
grep -w 'import' -i -r -n
如果不加-w,则是:
例子6:
通配符和正则的使用。
- 1 . 表示 任意一个字符
- 2 * 表示 零个或多个前面的字符
- 3 .* 表示0个或1个或多个任意字符,空行也包含在内
- 4 ? 表示0个或者1个前面的字符,使用的时候要\ 转义一下
- 5 + 表示一个或者多个+前面的字符
- 6 | 在正则表达式里面表示或者,能够写多个,是特殊符号,要使用转义 或者-E 或者 egrep
- 7 () 括号表示一个总体,{1,3}大括号表示一个范围,“ ? +(){} | ” 都是特殊符号,要使用必须转义或者-E 或者egrep,“. 和 *”不需要转义。[ ]也不需要转义。
“.*”比较不好理解,不过这个匹配表示匹配所有情况,也就是说相当于打印出所有文本内容,相当于“*” ,不过在其前面加其他字符就可以表示某字符开头的所有情况,因此实际意义不大。
grep 's.*' -i -r -n
grep 'impor*t' -i -r -n
grep 'impo.t' -i -r -n
grep 's\{2\}' -i -r -n
grep 'impo\?rt' -i -r -n
grep '\(_\)\{2\}' -i -r -n
egrep '(_){2}' -i -r -n
需要注意的是()是需要转义的,而[ ]是不需要转义的。
grep 'impor\+t' -i -r -n
grep 'impo[a-zA-Z0-9]t' -i -r -n
[ ]是不需要转义的,()是需要转义的。
[ ]表示的是单一字符的匹配范围,()表示的是1个或多个字符的匹配范围。
a-z 表示所有小写英文字母;
A-Z 表示所有大写英文字母;
0-9 表示所有数字。
如果字符^在[ ]之中则表示取反,例子:
grep 'impo[a-z]t' -i -r -n
grep 'impo[^a-z]t' -i -r -n
匹配字符中^代表行首,$代表行尾,"^s"代表位于行首的为“s”的字符,“s$”代表位于行尾的为“s”的字符,例子:
grep '^i' -i -r -n
grep 'b$' -i -r -n
grep '^i.*s$' -i -r -n
其中,“.*”表示任意长度的任意字符串。
{ } 指定重复的字符或字符串个数:
grep 's\{2\}' -i -r -n
等价于:
grep '\(ss\)\{1\}' -i -r -n
等价于:
grep 'ss' -i -r -n
{ } 中可以指定多个重复的数值:
grep 's\{1,2\}' -i -r -n
grep 'imp\(or\|ro\)t' -i -r -n
可以在特殊字符“( )”的中间嵌套其他特殊字符。
--include 在遍历目录时指定只包含的文件;
--exclude 在遍历目录时指定不包含的文件;
grep 'import' -i -r -n --include main.py
grep 'import' -i -r -n --exclude main.py
只匹配空行,“^$” 。
grep '^$' -i -r -n
======================================================
grep -E 等价于egrep,相当于对需要转义的字符提前做了转义。
通配符和正则的使用。
- 1 . 表示 任意一个字符
- 2 * 表示 零个或多个前面的字符
- 3 .* 表示0个或1个或多个任意字符,空行也包含在内
- 4 ? 表示0个或者1个前面的字符,使用的时候要\ 转义一下
- 5 + 表示一个或者多个+前面的字符
- 6 | 在正则表达式里面表示或者,能够写多个,是特殊符号,要使用转义 或者-E 或者 egrep
- 7 () 括号表示一个总体,{1,3}大括号表示一个范围,“ ? +(){} | ” 都是特殊符号,要使用必须转义或者-E 或者egrep,“. 和 *”不需要转义。[ ]也不需要转义。
- grep -n 显示符号要求的行,并显示行号
- grep -c 打印符合要求的行数
- grep -v 打印不符合要求的行,取反的意思
- grep -r 会把目录下的全部文件所有遍历;-r针对的是目录,若是不加-r只能针对文件
- grep -i 忽略大小写
- grep -A2 打印符合要求的行以及下面两行
- grep -B2 打印符合要求的行以及上面两行
- grep -C2 打印符合要求的行以及上下两行
- grep -w 匹配一个完整的单词
- grep -E 特殊符号脱意==egrep
- centos7中自带 --color显示颜色 ;
- grep 跟特殊符号的话,要用单引号
- grep --include 包含
- grep -l 只打印出含有匹配字符串的文件名,不输出具体匹配行的数据
======================================================
参考:
http://www.noobyard.com/article/p-khsjayud-o.html
http://t.zoukankan.com/seaBiscuit0922-p-7744558.html