文本查找以及正则表达式

文本查找

grep,egrep,fgrep

grep:Global Research

grep:使用正则表达式实现文本能过滤,默认情况下只支持基本正则表达式

根据模式搜索文本,并将符合模式的文本显示出来

Pattern:模式 文本字符与正则表达式的元字符组合的匹配条件

语法

grep [options] PATTERN [FILE]....

参数

`-i: 忽略字符大小写的差别

`

--color:以高亮颜色显示

-v 反转查找 没有被模式匹配的行显示出来

-o 只输出文件中匹配到的字符串,每个字符串一行

-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。

-A #:<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容,具体情况史参数而定。

-C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容

-B:


匹配字符的符号

*:任意长度的任意字符

?:任意单个字符

[]:匹配范围内的任意单个字符

[^]:匹配范围之外的任意单个字符

字符集合:[:digit:] ,[:lower:],[:upper:],[:punct:],[:space:],[:alpha:],[:alnum:]


正则表达式 Regular EXPression,REGEXP

元字符

` .:匹配任意单个字符

`

匹配次数

*:匹配*前面的字符任意次,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

egrep

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 优先级最低的。


fgrep

grep、egrep 需要消耗大量的CPU

fgrep:不支持正则表达式 不需要消耗大量的CPU资源

用来搜索 file 参数指定的输入文件(缺省为标准输入)中的匹配模式的行

fgrep 命令特别搜索 Pattern 参数,它们是固定的字符串

如果在 File 参数中指定一个以上的文件 fgrep 命令将显示包含匹配行的文件

results for ""

    No results matching ""