时间:2017.11.20
作者:李强
参考:man,info,magedu讲义
声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。
1、使用目的与场景
一些命令都会使用到查询和匹配一些东西的时候,而正则表达式的过滤功能就可以被调用。
比如grep,find -regex ,vi ,等
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、用法
1
2
3
4
5
6
|
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下的查找替换功能的窗口。
你想要什么操作就是option选项,你想要过滤什么内容就用正则表达式( ERE|BRE )
感觉正则表达式就像管道,左边进右边出,一次输入一行内容,然后根据匹配条件,
一个字符一个字符找,找到了匹配条件,取出字符,print为一行,然后再去匹配,取出字符,print为一行
Matcher Selection:
egrep -F fgerp -G (默认)使用BRE -P
Matching Control: -e
-e可以跟多个pattern,各个pattern之间待验证。
另外就是可以查找-开始的字符不会当做参数操作而是当做pattern,而不用去加引号转义符\-
-f 从文件中获取patterns模式,每行一个 -i 忽略大小写 -w--word-regexp 输出指定词组的行,词组成成分是字母数字和下划线
,如果有其他特殊字符也会匹配这个要注意使用的场景,最好加双引号 “” ,\用[\]表示,()用\(\),具体还要分析
-v 反转匹配的结果,选择非匹配行打印出来-x --line-regexp 只选择那些与整行完全匹配的匹配项 -y 已过时的选项,-i的同义词
General Output Control:
--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区别在于不用\来转义{} () ? + |
4、pattern的一些组合
[lq@centos6 ~]$ifconfig | egrep -o "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-2][0-2])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"
主机可用IP地址:1-223|0-255|0-255|1-254,[]()\.等的组合用法
本文转自 lajifeiwomoshu 51CTO博客,原文链接:http://blog.51cto.com/lajifeiwomoshu/1983678