文本查找
grep,egrep,fgrep
grep:使用正则表达式实现文本能过滤,默认情况下只支持基本正则表达式
根据模式搜索文本,并将符合模式的文本显示出来
Pattern:模式 文本字符与正则表达式的元字符组合的匹配条件
语法
grep [options] PATTERN [FILE]....
参数
`-i: 忽略字符大小写的差别
`
--color:以高亮颜色显示
-v 反转查找 没有被模式匹配的行显示出来
-o 只输出文件中匹配到的字符串,每个字符串一行
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-A #:<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容,具体情况史参数而定。
-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容
-B:
*:任意长度的任意字符
?:任意单个字符
[]:匹配范围内的任意单个字符
[^]:匹配范围之外的任意单个字符
字符集合:[:digit:] ,[:lower:],[:upper:],[:punct:],[:space:],[:alpha:],[:alnum:]
元字符
` .:匹配任意单个字符
`
匹配次数
*:匹配*前面的字符任意次,0次也可以
a,b,aab,acb,adb,amnb,amnbmnbmnbmnb
a*b 意味着a出现任意次,之后跟一个b
a.*b .*表示任意长度的任意字符 其匹配上述所有字符串
默认情况下,正则表达式工作在贪婪模式下
\?:匹配其前面的字符1次或者0次
有部分匹配即可
\{m,n\}:匹配其前面的字符至少m次,最多n次
\{1,\}:至少一次
\{0,3\}:最少一次,最多三次
^:锁定行首,此符号后面的任意内容必须出现在行首
$:锁定行尾,此符号前面的任意字符必须出现在行尾
^$:空白行
[[:digit:]]$ 以数字结尾的行
[[:space:]][[:digit:]]$ 以空白加数字结尾的行
\<或\b:锚定词首,其后面的任意字符必须作为单词的首部出现
\>或\b:锚定词尾,其前面的任意字符必须作为单词的尾部出现
例子
\<root\>
\( \)
例子
ab* a之后b出现一次或者任意次
\(ab)\* 将ab作为一个整体可以出现任意次
He love his lover,
She like her liker.
\1:第一个左括号与其对应的右括号所包含的所有内容
\2
\3
" ":强引用
' ':弱引用
如果不涉及到变量的使用,单双引号的作用一样
Basic REGEXP 基本
Extended REGEXP 扩展
字符匹配与基本正则表达式一样
.
[]
[^]
*: 匹配*前面的字符任意次,0次也可以
?:匹配其前面的字符一次或零次
+:匹配其前面的字符至少一次
{m,n}:不需要'\'
^
$
\<
\>
分组
():分组
\1,\2,\3,...
|:or
例子
C|cat:C或者cat
(C|c)at:Cat或者cat
grep -E= egrep
找出/boot/grub/grub.conf文件中1-255之间的数字
\<([1-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])\>.\<([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])\>.\<([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])\>
查找类似于IP地址一样的数字
ifconfig | egrep -o --color '\<([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])\> '
ifconfig | egrep -o --color '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.){2}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'
扩展正则表达式与基础正则表达式的唯一区别在于:? + () {} 这几个字符。
基础正则表达式中,如果你想? + () {}表示特殊含义,你需要将他们转义
而扩展正则表达式中,如果你想? + () {} 不表示特殊含义,你需要将他们转义。
转义符号,都是一样的,\符号。
所谓特殊含义,就是正则表达式中的含义。非特殊含义,就是这个符号本身。
例如[[email protected] ~#] echo aaa|grep 'a?'
;
[[email protected] ~#] echo aaa|grep 'a\?'
;
aaa#egrep
使用的是扩展正则表达式
[[email protected] ~#] echo aaa|egrep 'a?'
;
aaa[[email protected] ~#] echo aaa|egrep 'a\?'
;
可见,扩展正则表达式与基础正则表达式的区别,就是它们加不加转义符号,代表的意思刚好相反。
ERE 历史没有后向引用的。圆括号在ERE里具有特殊含义,但和 BRE 里使用的又有所不同。在ERE里, \ ( 与 \ )匹配的是字面上的左括号与右括号。
匹配单个表达式与多个正则表达式
ERE 在匹配多字符这方面,与 BRE 有明显的不同,不过在(*)的处理上和 BRE 是相同的。
注意:有一个例外,*作为 ERE 的第一个字符是“未定义的”,而在 BRE 中它是指“符合字面的”。
一般情况下使用 grep 控制 BRE,使用 egrep 控制 ERE。
使用 ERE 匹配我们之前介绍过的离子“要刚好重现 5 个 a”以及“重现 10 个至 42 个 q”,写法分别为:a{5}
,q{10,42}
。而{与}则可以匹配字面上的花括号。当在 ERE 里{找不到匹配}时,POSIX 特意保留其含义为“未定义状态”。
ERE 另有两个 meta 字符,可更细腻的处理匹配控制:?
匹配于 0 个或一个前置正则表达式+
匹配于一个或多个前置正则表达式
可以把?想象成是“可选用的”,也就是说,匹配前置正则表达式的文,要么出现,要么没出现。例如:与ab?c
匹配的有 ac 与 abc,就这两者 ! (与 ab*c 相较之下,后者匹配于中间有人一个 b)。
+
字符在概念上与* meta
字符类似,不过前置正则表达式要匹配的文本在这里至少得出现一次。
例如
ab+c
匹配于 abc,abbc,abbbc,但是不匹配于 ac。
ab+c
的正则表达式等价于 abbc;无论如何,当前值正则表达式很复杂时,使用+可以少打一点字,这就减少了打错字的几率。
方括号运算符一宇表示“匹配于次祖父,或其他字符,或...”,但不能指定“ 匹配于这个序列,或其他序列”。要达到后者的目的,可以使用管道运算符 ( | )。例如read | write
匹配于 read 与 write 两者,fast|slow
匹配于 fast 与 slow。
| 字符是 ERE 运算符;i 优先级最低的。
grep、egrep 需要消耗大量的CPU
fgrep:不支持正则表达式 不需要消耗大量的CPU资源
用来搜索 file 参数指定的输入文件(缺省为标准输入)中的匹配模式的行
fgrep 命令特别搜索 Pattern 参数,它们是固定的字符串
如果在 File 参数中指定一个以上的文件 fgrep 命令将显示包含匹配行的文件