来源:自学PHP网 时间:2015-04-14 11:51 作者: 阅读:次
[导读] linux的命令行可以胜任所有的工作,这和ms的产品有着很大的区别,到现在为止仍然有很多的爱好者对敲键盘乐此不疲,而在繁重的管理工作和键盘工作中,正则表达式对于简化工作起到...
linux的命令行可以胜任所有的工作,这和ms的产品有着很大的区别,到现在为止仍然有很多的爱好者对敲键盘乐此不疲,而在繁重的管理工作和键盘工作中,正则表达式对于简化工作起到了很大的作用。 Perl regular expressions man page.
http://www.perldoc.com/perl5.8.0/pod/perlre.html
一、正则表达式简介 事实上,正则表达式不仅适用于linux,多种编程语言中也可以使用到它,因为它实际上是人们对于某种规律的表达方式。
如果要把他的所有应用都讲上的话那这篇文章会变的太长以至于无法阅读,我只介绍他在linux下和几种最重要的命令的搭配使用。
基本的元字符集:
^行首
$行尾
*匹配星号前的字符一次或多次
[]匹配[]内的字符,可以是一个字符也可以是字符列
\用来屏蔽一个元字符的特殊含义,可以使其失去原有的意义。
pattern\{n\}用来匹配前面pattern出现的次数。n为次数。
而其中使用最多的是行首和行尾,无论在任何地方都可能会用到它们,比如vi,你输入$,就可以跳到行尾,在bbs上,你也可以输入$,直接跳到这个版的最后的一篇文章。
后面所说的将是他们的和具体命令结合的例子。
二、grep 和正则表达式
grep是个非常常用的工具,linux其实和internet一样,都是一个充满了大量信息、数据的东西,如何有效的过滤自己不用的信息、获取有用的信息反映了一个人水平的高低,当我还是linux新手的时候还不懂得用grep呢。
一个最简单的应用例子就是如何查看一个目录里只查看文件夹了,ls并没有提供这样的参数给你,而是需要你用grep(或后面提到的awk)来实现这样的功能。我们知道一个文件夹的属性为dxxx,所以我们可以用ls -l |grep ^d,即打印匹配行首第一个字母为d的项目,这样就把所有的文件夹打印出来而忽略其他非文件夹的文件了,举一反三,我们可以用来匹配所有的权限,比如我想找到所有权限为rwx------的文件,这样我们就可以输入ls -l|grep ^.rwx,其中.号为匹配任意一个字符。再看下面的例子,想找权限为----rw----的文件,可以使用ls -l|grep ^....rw....,怎么样,这样简单多了吧,我们还可以寻找所有以*号结尾的文件(在某些linux上用它来代表可执行文件)即ls |grep \*$,要注意的是必须加\以屏蔽*号的原来的特殊意义,而$号是加在行尾的。
可以用^符号来再非正则表达式的意思(即否定)如前面我说了要看文件夹,那么如果我想看不是文件夹的文件怎么办 : ls -l|grep ^[^d],这样的意思就是说查看所有行首不为d字母的项,当然也可以用grep 的-v选项实现同样功能。不过今天重点是说正则表达式,所以就不讲参数了。
我还可以查找多个文件,如有一个目录里面有我需要的内容,我只知道他在某个.doc文件里头,我可以用grep "表达式" *.doc,而这个表达式就需要你去想了,有www.2cto.com多种方法可以指定模糊的表达式,如k...D,代表以小写字母k开头,中间三个是任意字符而以大写字母D结尾的字符串,而k*D,则表达以k开头中间可以是任意长度任意字符的而以D结尾的字符串,还可以用[]指定范围,如[12345]day,指的是以1到6中任意一个字符开头后面是day的字符串,像3day就匹配这个表达式而13day就不匹配。[Ss]可以指定以大写S或者小写s的字符,而像结合pattern\{n\}还可以用更奇妙的用法,我就不多说了。
三、awk和正则表达式
awk对于从大的数据文件中抽取指定的数据包十分有用,比如你可以用他来管理passwd文件,或者是日志文件(相当巨大的文件,而用了awk就会变的很轻松了),通常awk都是和grep结合来用的,又grep抽出行,再有awk抽出行中指定的列,不过就算单独用awk也一样好用。请看看这样的例子
awk -F: '{if($6 ~ /bash/) print $0}' /etc/passwd
这是个相当复杂的例子,我举这个例子的目的只是为了说明结合命令语法和正则表达式可以实现相当强的过滤作用,这个命令的作用是从passwd文件中的第六列中www.2cto.com抽取所有含有bash的项目然后在打印这些项目的第一项即他们的用户名。我假设passwd为这样的内容
root:*:*:*:*:*:/bin/bash
user:*:*:*:*:*:/bin/bash
xie:*:*:*:*:*:/bin/csh
ftp:*:*:*:*:*:/bin/zsh
那么输出就应该为
root
user
我们逐个来分析,首先 -F:指定:为分隔符,因为默认的分隔符是空格,然后我们用一个假设语句,因为假设语句和后面的print组合成一个动作,所以必须用花括号括起来,意思是如果(if)第六列($6)匹配(~)字符串bash,那么打印(print)第零列($0)。其中/bash/指的是匹配bash,//只是起括起来的作用,并不参与判断。
awk有自己的正则表达式和条件操作符,他比一般的正则表达式要多出两个元字符,就是+和?,+使用匹配一个或多个字符。匹配模式出现频率,例如使用/XY?Z/匹配XYZ,或YZ。条件操作符有
=大于等于
~匹配正则表达式
!~不匹配正则表达式
结合以上表达式,还可以作出更多的动作,如
ls -l|awk 'BEGIN {print "Name\t SIZE"} {if /^[^d]
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com