正则表达式 Linux Shell


正则表达式

热身

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

例如 grep, expr, sed , awk. 或Vi中经常会使用到正则表达式,为了充分发挥 shell 编程的威力,需要精通正则表达式。 

下面先举个简单例子来让大家对正则表达式有个直观的感受。ls命令是linux下最常用的命令。ls命令是list的缩写,缺省下ls用来打印出当前目录的清单。

现在,我们只希望列出以d开头的文件或目录,可以用ls d* 命令,这里*就是正则表达式,它表示匹配重复零次或多次前一字符。

举一反三,列出以che 开头的文件或目录,就可以用ls che* 命令。

是不是觉得有些觉得过于简单了啊??!!好吧,打完小怪,现在升下级。

开始……

如何列出当前目录下的所有目录(不包含下面的子目录)

思考……

又到了使出正则表达式杀手锏的时候了,在这里,我们还是使用ls 命令,但是加了个 -l选项(-l选项作用是列出文件的详细信息),使用正则表达式列出当前目录下的所有目录,我们给出了两种方法(聪明的你当然会想到也可以用find命令,呵呵,这属于第三种秘笈了)。且看:

这样列出来的内容有些多,没完全截下来所有显示结果,但这并不妨碍本文的讲解。

考虑到普通文件是以-开头,如dataf1.txt文件;目录是以开头的,如 adv_shell 是目录,即第一个字母会不小心暴露出文件的身份属性。

所以我们就从d这里作为突破口,这时,你会想到,有多少个“开头”的d就应该有多少个目录,太聪明了,好吧,我们按照你的思路实践下。

现在,问题出来了,怎么统计出来有多少个“开头”的d?你想到了linuxgrep命令,还想到了正则表达式,于是grep正则表达式开始粉墨登场了……

ls -l |grep "^d"

这条简单的命令就轻松解决了我们的问题,。"^d"???你纳闷了,这个小东西配合起来怎么会有那么大的威力呢?这好比玩三国杀时刘备、司马懿、香香之间配合的威力……"^d",就是正则表达式的用法,"^"表示匹配行首,"^d"合起来就表示以d开头的一行,grep "^d" 就是过滤出以d开头的那些行,表示目录,也就过滤出了当前目录中的所有目录。

谜底解开。现在你又想到,前面不是说还有一种方法的么,既然如此迫不及待,那就只好顺水推舟了。

第二种方法还是基于ls命令,但是用了-F 选项,-F 选项能列出文件类型的指示符号,如下图所示:

仔细观察我们发现,在文件名后面,会多出了一些符号,如目录adv_shell名字后多了条斜扛(/),可执行文件checkhost.sh名字后多了个星号(*)……在此,如果想更多了解这些符号意义,可以查看ls 命令的详细信息。

我们现在把注意力集中到目录adv_shell名字后多了条斜扛(/)这条信息上。很快联想到,有多少个斜扛(/)就应该对应多少目录,而且斜扛(/)会跟在每个目录名的最后。我们又想到了grep命令,还想到了应该怎样用正则表达式表示出匹配行尾,答案已经很接近了……

ls -F | grep "/$" 

这条短命令又一切成全了我们的梦想。"/$" 也是正则表达式的用法,"$"表示匹配行首,"/$"合起来就表示匹配以/结尾的行,grep "/$" 就是过滤出以/结尾的那些行,/表示目录,也就过滤出了当前目录中的所有目录。

在此基础上,我们发散一下思维,比如说想统计当前目录下的文件个数及目录个数,就可以使用以下命令:

ls -l * |grep "^-"|wc -l 

ls -l * |grep "^d"|wc -l 

好了,暂且休息,下面我们开始介绍更多关于正则表达式的知识。

  • 1
  • 2
  • 3
  • 下一页

相关内容