Linux shell之grep(《Linux与Unix shell编程指南》读书笔记)

来源:互联网 发布:杭州美容院软件 编辑:程序博客网 时间:2024/05/18 06:47

1.说明

          本文参考摘录自《Linux与Unix shell编程指南》


2.基本概念

(1)grep(全局正则表达式版本)允许对文本文件进行模式查找,如果找到匹配模式,grep打印包含模式的所有行。grep支持基本正则表达式,也支持其扩展集。

           一般格式:

          grep [选项] 基本正则表达式 [文件]

//本文的测试用例

(2)常用的grep选项有:

-c 只输出匹配行的计数。

-i 不区分大小写(只适用于单字符)。

-h 查询多文件时不显示文件名。

-l 查询多文件时只输出包含匹配字符的文件名。

-n 显示匹配行及行号。

-s 不显示不存在或无匹配文本的错误信息。

-v 显示不包含匹配文本的所有行。

例:

1.行匹配(输只出匹配行的计数)

$ grep -c "48" data.f

$ 4

2.行数(显示匹配行及行号)

$ grep -n "48" data.f

(3)grep和正则表达式:

          双引号:在grep命令中输入字符串参数时,最好将其用双引号括起来。例如:“mystring”。

          //这样做有两个原因,一是以防被误解为 shell命令,二是可以用来查找多个单词组成的字符串,例如:“jet plane”,如果不用双引号将其括起来,那么单词 plane将被误认为是一个文件,查询结果将返回“文件不存在”的错误信息。

          //在调用变量时,也应该使用双引号,诸如:grep“$MYVAR”文件名,如果不这样,将没有返回结果。

          单引号:

          //在调用模式匹配时,应使用单引号。

          使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选择。使用正则表达式时最好用单引号括起来,这样可以防止grep中使用的专有模式与一些shell命令的特殊方式相混淆。

例:

1.$grep '48[34]' data.f //483 484

2.$grep '^[^48]' data.f //行首不是48

3.$grep 'K...D' data.f  //抽取以L开头,以D结尾的所有代码,可使用下述方法,因为已知代码长度为5个字符

4.$grep '[A-Z][A-Z]..C' data.f //头两个是大写字母,中间两个任意,并以C结尾

5.$grep '5..199[6,8]' data.f  //先查询所有以5开始以1996或1998结尾的所有记录。使用模式5..199[6,8]

6.$grep '^[0-9][0-5][0-6]' data.f //以行首开始第一个字符为0到9之间,第二个字符在0到5之间,第三个字符在0到6之间

7.$grep -E '219|216' data.f   //匹配“与”或者“或”模式,grep命令加-E参数,这一扩展允许使用扩展模式匹配

8.$grep 'conftroll\.conf' myfile //匹配特殊字符,查询文件名conftroll.conf

9.$grep '[0-9]\{3\}\.[0-9]\{3\}\.' ipfile  //查看nnn.nnn网络地址

10.类名

//grep允许使用国际字符模式匹配或匹配模式的类名形式

类名及其等价的正则表达式

[[:upper:]][A-Z] [[:lower:]][a-z][[:digit:]][0-9]  [[:alnum:]][0-9a-zA-Z][[:space:]]空格或tab键[[:alpha:]][a-zA-Z]

$grep '5[[:upper:]][[:upper:]]' data.f

 

(4)查询多个文件

例:

1.如果要在当前目录下所有.doc文件中查找字符串“sort”,方法如下:

$ grep "sort"*.doc

2.或在所有文件中查询单词“sort it”

$ grep "sort it" *

(5)命令行输出结果作为grep的"输入"

          上诉的例子都是从文本文件抽取和过滤,下面的例子是以命令行输出作为操作对象。

$ps -ef | grep -v "grep" | grep "processname"

//目的:查看"processname"进程是否正在运行

//ps -ef,e:参数显示所以进程,f:全格式

//在grep命令中使用-v选项可丢弃ps命令中的grep进程

 

3.小结

          如果要通过文件快速查找字符串或模式,并打印包含模式的所有行,grep是一个很好的选择。



1 0