Linux --- 正则表达式

正则表达式的作用:面对数据量庞大的系统,如果要要从千百行资料里找一行有问题的讯息,光用肉眼看的话是很难找到的,这个时候可以利用[ 正则表达式 ]的功能仅取出有问题的信息进行分析。这种方法还可以用在对邮件服务器的邮件剔除或查找。正则表达式除了简单的一组字符串处理之外,还可以作群组的字符串处理,例如进行搜寻VBird或者netman、lman的搜寻。grep 是一个很常见也很常用的命令,它最重要的功能就是进行字符串数据的比对,然后将符合使用者需求的字符串打印出来。

常用参数: grep [ - acinv ] '搜寻字符串'  filename

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

                                        -c:计算找到‘搜寻字符串’的次数

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

                                         -n:顺便输出行号

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

需要说明的是[ grep 在数据中查寻一个字符串时,是以“整行”为单位来进行数据的撷取的!] 假如一个文件内有10行,其中有两行具有你所搜寻的字符串则将那两行显示在屏幕上,其它的就丢弃了。grep 除了可以进行文件的资料搜寻之外,也常常被应用在input/output 的数据处理当中,例如常见的管线命令(pipe)就可以常常见到它的踪影!

因为不同的语系编码是不一样的,所以需要将语系改成英文语系,才能进行下面的测试,否则,可能会有显示的内容与下面的输出不符的状况,修改语系的方法:

以grep撷取字符串

(1)搜索特定字符串 cars

(2)如果想要[ 反向选择 ]呢?当该行没有'the'这个字符串时,才会显示在屏幕上

(3)在输出的每行前面加上它的行号以及输出显示不匹配的行

(4)如果我们想取得有数字的一行,就如下图这样:

(5)行首与行尾字符 ^$:

(6)过滤掉有 '=' 的行,这样可以忽略掉一些数据

(7)任意一个字符[.] 与重复字符[*]

我们知道万用字符 * 可以用来代表任意(0或多个)字符,但是正则表达式并不是万用字符,两者之间是不相同的!至于正则表达式当中的[.]则代表任意一个字符的意思

因为 * 代表的是重复(0个或多个前面的RE字符)的意义,因此,[o*]代表的是拥有空字符或一个o以上的字符。

如果我想要的字符串开头是g,结尾是d,当中的字符至少有一个 o,该如何找出

(8)如果我想找出[ 任意数字 ]的行列呢

虽然 grep -n '[0-9]*' hello_text 也可以得到相同结果,但是还是要理解上面命令当中RE表示法的意义才好

(9)限定连续RE字符范围 {}

我想找出2个到5个 o 的连续字符串,该如何操作?这个时候就要用到限定范围的字符 {} 了,但是因为 { 与 } 的符号在shell是有特殊意义的,因此,我们需要使用跳脱字符 \ 来让它失去特殊意义才行。假设我要找到2个 o 的字符串:

(10)重复特殊字符

经过上面几个简单的说明,我们可以将基础的正则表达式特殊字符汇总如下:

请特别留意的是[ 正则表达式的特殊字符 ] 与一般在命令列输入命令的[ 万用字符 ] 并不相同,例如,在万用字符当中,* 代表的是0~ 多个字符的意思,但是在正则表达式当中,* 则是重复 0 到多个的前一个RE字符的意思,使用的意义并不相同!

例如,不支持正则表达式的 ls 这个命令中,若我们使用[ ls -l * ] 代表的是任意文件名的文件,而 [ ls -l a* ] 代表的是以 a 为开头的任何文件名的文件,但在正则表达式中,我们要找到含有以 a 为开头的文件,则必须要这样: [ ls | grep -n '^a.*' ] 

另外,例如万用字符的反向选择,为 [ ! range ] ,至于正则表达式则是 [ ^range ] 

延伸正则表达式

在上面有一个说明,我们要去除空白行与行首为'='的行列,还可以简化为:[ egrep -v '^$|^=' hello_text ]

需要特别强调一下, grep 支持的是基础型的正则表达式,而 egrep 支持延伸正则表达式。实际上,egrep 是grep -E的命令别名,为了方便使用,我们还是以 egrep 来跟 grep 区分吧!

以上这些就是延伸型的正则表达式的特殊字符,另外,要特别强调的是这个 ! 在正则表达式当中并不是特殊字符,使用,如果你想要的查出文件中含有 ! 与 > 的字行时,可以这样: [ grep -n '[!>]' hello_text ]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值