在Linux中,有很多文本处理的方式,今天我们就来介绍其中的一种grep系。
grep系相对来说也是功能很强大的文本处理工具,俗称文本三剑客之一(其余两个为sed、awk)。
grep系可分为grep、egrep、fgrep(默认情况下不开启正则表达式)。
grep系的功能:利用正则表达式全局搜索,并将匹配的都显示出来
grep的用法格式: grep [options] PATTERN [FILE...]
其中PATTERN为要匹配的字符
先举个简单例子:[root@localhost ~]# grep -c root /etc/passwd
运行时就会在/etc/passwd目录下找出含有root的文件
其中root就是PATTERN
下面我们就重点来谈谈正则表达式。
正则表达式:
元字符:会被正则表达式引擎解释为特殊含义;
基本的正则表达式:BRE(grep默认使用)
扩展的正则表达式:ERE(egrep默认使用)
其中:
grep默认仅支持基本正则表达式;
egrep默认仅支持扩展正则表达式;
fgrep默认不开启正则表达式引擎;
文本字符:只具备字符表面含义的那些字符
grep系的选项有很多,下面列举一些比较常用的选项:
-i,--ignore-case
忽略模式 PATTERN 和输入文件中的大小写的分别。
-v,--invert-match
改变匹配的意义,只选择不匹配的行。反向匹配
-c,--count
禁止通常的输出;作为替代,为每一个输入文件打印一个匹配的行的总数。
-o,--only-matching
只显示匹配的行中与 PATTERN 相匹配的部分。关闭贪婪模式。
-q,--quiet,--silent
安静。不向标准输出写任何东西。如果找到任何匹配的内容就立即以状态值
0 退出,即使检测到了错误。 参见 -s 或 --no-messages 选项。
--colour[=WHEN],--color[=WHEN]
在匹配的行周围以 GREP_COLOR 环境变量中指定的记号来标记。WHEN
可以是 `never',`always',或是 `auto'。
-E,--extended-regexp(相当于egrep)
将模式 PATTERN 作为一个扩展的正则表达式来解释 (参见下面)。
-F,--fixed-strings(相当于fgrep)
将模式 PATTERN 视为一个固定的字符串的列表,用新行 (newlines)
分隔,只要匹配其中之一即可。
-G,--basic-regexp(相当于grep)
将模式 PATTERN 作为一个基本的正则表达式 (参见下面)
来解释。这是默认值。
-P,--perl-regexp
将模式 PATTERN 作为一个 Perl 正则表达式来解释。
-A NUM,--after-context=NUM
打印出紧随匹配的行之后的下文NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。
-B NUM,--before-context=NUM
打印出匹配的行之前的上文NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。
-C NUM,--context=NUM
打印出匹配的行的上下文前后各NUM行。在相邻的匹配组之间将会打印内容是 -- 的一行。
PATTERN:正则表达式字符:
基本的正则表达式字符:
globbing(简化版的正则表达式)
字符匹配:
.:匹配任意单个字符
所有的字符集都可以放到中括号中表示单个字符
[]:匹配指定位置的单个字符
[^]:匹配指定位置以外的单个字符
[:xdigit:]:所有的十六进制
a-z:所有的小写字母
A-Z:所有的大写字母
0-9:所有的十进制数字
次数匹配:表示该类字符之前的那个字符可以出现任意次
*:其前面的字符可以出现零壹或多次(使用较多)
\?:其前面的字符可有可无
\+:其前面的字符至少出现一次
\{m\}:其前面的字符必须出现m次
\{m,n\}:其前面的字符至少出现m次,至多出现n次
\{,n\}:其前面的字符至多出现n次
\{m,\}:其前面的字符至少出现m次
.*:任意长度的任意字符
位置锚定字符:
行锚定:
行首锚定:^
行尾锚定:$
字锚定:
字首锚定:\< 或 (\b老方法,一般不用了)
字尾锚定:\> 或 \b
注意:对于正则表达式引擎来说,字是由非特殊字符组成的连续字符串;
分组与引用字符:
\(PATTERN\):PATTERN当作整体字串来处理,不分开
例:\(yxz\):其中把yxz当作一个整体来进行搜素
在正则表达式引擎中,有一系列的内置变量,这些变量会保存至所有分组内的字符信息。用于后向引用,这些变量依次是:\1,\2,\3,
\1:第一组小括号中的PATTERN匹配到的字符
\2:第2组小括号中的PATTERN匹配到的字符
例:找uid与gid相同的用户
[root@localhost ~]# grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd
用户名与bash相同
[root@localhost ~]# grep '\(\<[[:alpha:]]\+\>\).*\1$' /etc/passwd
或:\|(多选一)
注意:\|将其左右两边的字符串当作整体对待;
例子: [root@localhost ~]# grep -c '^[[:space:]]*$' 2
ifconfig | grep '\<1[0-9][0-9]\>'
ifconfig | grep '\<255\>$'
grep [options] [-e PATTERN | -f FILE] [FILE...] [FILE...] (例:/etc/* )
默认情况下,grep只有一个PATTERN,如果想要写多个PATTERN的话,要使用-e 选项
将所需要的PATTERN写入到一个文件中,保证每行只有一个PATTERN,此时我们可以使用-f file方式
egrep:默认仅支持扩展正则表达式
grep [options] PATTERN [FILE...]
扩展的正则表达式元字符与grep差不多
但其“或”符号为: |
fgrep:PATTERN所有的字符都被当作文本字符来处理