linux_第10章正规表示法

10   正规表示法

1 什么是正规表示法

什么是正规表示式呢?简单的说,在 Linux 的环境下,我们可以透过字符串以及一些特殊字符的辅助来进行文字的比对工作,好来让使用者筛选自己所需要数据。这些特殊的字符与搭配使用的工具,就构成了正规表示法的主轴。

例如 /etc/rc.d/init.d 这个目录当中好了,如果你要找到一个文件内容含有 mail 这个字符串的文件名,要怎么搜寻呢?利用 grep 配合 mail 以及万用字符来搜寻所有的文件名grep  'mail'  /etc/rc.d/init.d/*

2 grep

语法:[root @test /root ]# grep [-acinv] '搜寻字符串' filenames-list

参数说明:

-a :将 binary 文件以 text 文件的方式搜寻数据;

-c :计算找到 '搜寻字符串' 的次数;

-i :忽略大小写的不同,所以大小写视为相同;

-n :顺便输出行号;

-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行。

范例:

[root @test /root]# grep 'root' /var/log/secure

搜索 /var/log/secure 这个文件中包含 root 的行

[root @test /root]# grep -v 'root' /var/log/secure

搜索没有 root 的行

[root @test /root]# grep [A-Z]ANPATH /etc/man.config

说明:grep 是一个很常见的指令,最重要的功能就是进行字符串数据的比对了,需要说明的是grep 在一个文件中查寻一个字符串时,他是以"整行"为单位来数据的撷取的。grep 是最简单的正规表示法搜寻指令之一,它并不支持一些更严谨的正规表示法内容,不过,已经相当的好用。

例如:找出这个文件里面含有 know 这个字符,并将行号列出来:注意,大小写是不一样的

[root @test /root ]# grep -n 'know' regexp.txt

例如二:找出这个文件里面含有 * 这个字符,并将行号列出来:

[root @test /root ]# grep -n '/*' regexp.txt

例如:我要将所有 know 不论大小写都列出来,并列出行号:

[root @test /root]# grep -ni 'know' regexp.txt

注意:类似的指令还有egrepawkgawksed等,将在后面详细说明

3 正规表示法的特殊字符(charaters)

特殊字符                                 表示意义

^word                                           待搜寻的字符在行首

word$                                           待搜寻的字符在行尾

.                                                  匹配任何一个可能的字符

/                                                  跳脱符号将特殊字符变成普通字符

?                                                        任何一个『单一』字符

*                                                 匹配模式中重复的字符

[list]                                             列表中的字符

[range]                                          列表中范围内的字符

[^list]                                            反向选择,与 [list] 相反

[^range]                                    反向选择,与 [range]相反

/{n/}                                            与前一个相同字符连续 n

/{n,m/}                                     与前一个相同字浮连续 n-m

请特别留意的是,正规表示法的特殊字符与一般在指令列输入指令的万用字符并不相同,例如,在万用字符当中, * 代表的是 0 ~ 无限多个字符的意思,但是在正规表示法当中, * 则是重复前一个字符的意思~使用的意义并不相同,不要搞混了。

例如:在 /etc 底下,只要含有 XYZ 三个字符的任何一个字符的那一行就列出来

grep  [XYZ] /etc/*

例如:我想要知道在 /etc 里面,只要句首是 w-z 的就将他印出来?

grep  ^[w-z] /etc/*

例如:ls l | grep ^d   查询子目录

注意:使用规则表达式要养成良好的习惯,就是在匹配模式的两端加上‘’。这样和shell的文件通配符号做区别。

4   diff比较两个文件内容是否有不一致的指令

语法:[root @test /root ]# diff file1 file2

范例:[root @test /root]# diff index.htm index.html

5   充分规则表达式专用字符

符号                                             执行

pattern1 |  pattern2                       逻辑或

(patten)                                            对模式进行分组

char+                                               搜索前面字符的一个或者多个重复实例

char?                                                搜索前面字符的一个或者0个实例

例如:

t+  匹配一个或一个以上连续的t,如t  tt  ttt

t?  匹配0个或1t  t或‘

create | stream                               和两种模式的任一种进行匹配

 

你可能感兴趣的:(linux_第10章正规表示法)