时间:2017.11.20
作者:李强
参考:man,info,magedu讲义
声明:以下英文纯属个人翻译,英文B级,欢迎纠正,盗版不纠,才能有限,希望不误人子弟为好。
1、使用目的与场景
2、官方说明
grep: Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文 本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
3、写在前面
通配符是用来匹配文件名时使用的,在命令里一般都可以使用比如ls,grep的参数file都可以是用通配符表示
正则表达式是针对字符使用的,但是正则表达式在ls里就没法使用,
使用正则表达式的工具有grep,sed,awk,wim,less,Nginx,varnish等
正则表达式(regular expressions)有:基本正则表达式BRE;扩展正则表达式ERE
正则表达式中有元字符的概念,
元字符分类:字符匹配,匹配次数,位置锚定,分组
man 7 regex regular expressions正则表达式
man 7 glob 通配符
4、涉及文件及变量
5、用法
NAME
grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
这个FILE可以是好多种的文件,比如dpdc,-r 还可以用glob来表示。
我觉得理解这个概念,可以在此处放一个windows下的查找替换功能的窗口。
Matcher Selection: | |
-E | egrep |
-F | fgerp |
-G | (默认)使用BRE |
-P | |
Matching Control: | |
-e | -e可以跟多个pattern,各个pattern之间待验证。 另外就是可以查找-开始的字符不会当做参数操作而是当做pattern,而不用去加引号转义符\- |
-f | 从文件中获取patterns模式,每行一个 |
-i | 忽略大小写 |
-w | 输出指定单词的行,这里主要是这个字符集在文件是单独作为一个词的概念 |
-v | 反向选择输出结果的行 |
-x | |
-y | 已过时的选项,-i的同义词 |
General Output Control: | |
-c | 禁止正常输出;相反,为每个输入文件打印匹配行计数。 |
--color=auto,always,never 默认auto | |
-L | 找出来那个文件里不存在匹配的内容就打印出文件名可以被管道符当stdin使用 |
-l | 和-L相反,打印出存在匹配的内容的文件名,可以被管道符当stdin使用 |
-m | 最多只显示出查找到的几行,并不都显示出来。 |
-o | 只打印匹配行的匹配部分(非空部分),将每个此类部分放在单独的输出行上。比如我想知道/etc/passwd 一共有多少个bash字符,那么就可以使用这个选项然后uniq -c |
-q | 如果成功不输出到STDOUT,但是错误会显示错误信息。这里也是>是没用的,2>可以 |
-s | 不管对错都不输出任何信息。注意的是不输出任何信息,> 2> 并没有作用 |
Output Line Prefix Control: | |
-b | 对于文件行首开始,每个匹配项到行首的位置,第32个字符,第65个字符之类的,好像 |
-H | (默认)当有多个搜索文件存在时,打印每个文件名 |
-h | (默认)单只搜索一个文件时,不打印文件名 |
-n | 打印文件中匹配的行,并且将文件中是哪行的行号也一起打印 |
-T | 看不懂,方正加了之后格式就不会因为Hnb参数改变了 |
-u | |
-z | 也看不懂,-lz然后“”print(.*)“”然后输出结果,打印出文件名,说明在文件中匹配到了,可以跨行来查找好像。 |
Context Line Control:(参数后跟数字) | |
-A | --after-context=NUM 打印匹配行并且往后显示多少行 |
-B | --before-context=NUM 打印匹配行并且往前显示多少行 |
-C | --context=NUM 打印匹配行并且上下显示多少行 |
File and Directory Selection | |
-a | |
-H | |
-D | |
-d | |
--exclude=GLOB | |
--exclude-from=FILE | |
--include=GLOB | |
--exclude-dir=DIR | |
-r | 如果grep跟的是目录那么递归去查询目录下的所有文件是否包含pattern内容。 |
-R |
字符匹配:
字符匹配怎么匹配一个字符串string不是characters,
默认比如写abc就是匹配包含有abc这个字符串的行
. | 匹配任意单个字符 |
[] | 匹配指定范围内的任意单个字符 |
[^] | 取反的意思 |
字符类character class | |
[:alnum:] | 字母和数字 |
[:alpha:] | 代表任何英文大小写字符,亦即 A-Z, a-z |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:blank:] | 空白字符(空格和字符) |
[:space:] | 水平和垂直的空白字符(比[:blank:]包含的范围广) |
[:cntrl:] | 不可打印的控制字符(退格、删除、警铃、、、) |
[:digit:] | 十进制数字 |
[:xdigit:] | 十六进制数字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号 |
注意:-w,匹配单词时一定要注意的,默认不使用正则表达式的字符不加选项, 表示查找匹配包含这个字符串的行 |
匹配次数:
用在要指定次数的字符后面,用于指定前面的字 符要出现的次数
* | 匹配前面的字符任意次,注意这里只是前面的字符,任意次就是0-∞ |
\? | 匹配前面的字符0或者1次,0|1 |
\+ | 匹配前面的字符至少1次,1-∞ |
\{n\} | 匹配前面的字符n次 |
\{n,\} | 匹配前面的字符至少n次 |
\{,m\} | 匹配前面的字符最多m次 |
\{n,m\} | 匹配前面的字符至少n次,最多m次 |
位置锚定:
行位置锚定 | |
^ | 行首 |
$ | 行尾 |
^$匹配空行,^[[:space:]]*$匹配非空空白行 | |
单词位置锚定 | |
\< | 词首 |
\> | 词尾 |
\b | 词起始位 |
\<pattern\>或者\bpattern\b但是因为有b这个单词所以还是\<\>适用广些 | |
分组,后向引用,或 | |
\(\) | 将一个或多个字符捆绑在一起,当作一个整体进 行处理,如:\(root\)\+ |
后向引用 | 后面使用\1\2来调用前面的第几个\(pattern1\)匹配到的字符 |
\| | 字符或之间的关系,例如a\|b a或b C\|cat C或cat \(C\|c\)at Cat或cat |
6、实际应用分析
1、这里PATTERN什么时候使用单引号和双引号呢
这里中间存在,或者空格的别是分段的都需要用“” 引起来?待验证
用单引号反而第一个\的转义效果生效了,但是用"",\\都不做字符处理了
这里还是有待验证
2、如果要使用特殊字符本身
用转义字符表示
? 表示重复匹配0次或1次\?
+ 表示重复匹配1次以上\+
[] 表示匹配[]里的任意单个字符
{} 表示这个{}要用\字符去转义 \{ \}
其他和正常一样写{n}{n,}{,m}{n,m}差不多的写法,不同的是这里表达的含义是匹配的次数而已
{n}表示的就是匹配n次,{n,}表示匹配至少n次,{,m}表示匹配最多m次,{n,m}表示匹配次数最少n次,最多m次。
()
这个东西在正则表达式就是如上\( \) ,
然后在grep中对这个有个操作是会把()匹配的字符当做是一个变量从前往后1,2,.....,
可以用\1 \2去调用第几个()匹配的字符
|
表示或者的意思,也要用\转义,就是\|
\(a\|b\) 代表意思就是a或者b
因为 ? + {}()需要被转义,因此正常使用就是说的这个字符本身了。
相反\ * - [] 不需要被转义,如果要使用需要用\转义来代表本身 \\ \* \[\]
因为. 有含义,所以使用.需要被转义\.
3、grep和egrep的区别
好麻烦,所以egrep
egrep和grep区别在于不用\来转义{} () ? + |
本文出自 “我是一只小小菜鸟” 博客,请务必保留此出处http://lajifeiwomoshu.blog.51cto.com/5110076/1983678
原文地址:http://lajifeiwomoshu.blog.51cto.com/5110076/1983678