grep常见用法

第1章 grep选项

1.1 选项列表

选项

含义

-c

只输出匹配行的计数

-i

不区分大小写

-h

查询多文件时不显示文件名

-l

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

-n

显示匹配行及行号

-w

只选择含有能组成完整的词的匹配的行

-v

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

-A NUM

打印出紧随匹配的行之后的下文 NUM 行

-B NUM

打印出匹配的行之前的上文 NUM 行

-C NUM

打印出匹配的行的上下文前后各 NUM 行

-m NUM

在找到NUM个匹配的行之后,不再读这个文件

-R/-r

递归地读每一目录下的所有文件

-R/-r --include=PATTERN    

仅仅在搜索匹配PATTERN的文件时在目录中递归搜索

-R/-r --exclude=PATTERN

在目录中递归搜索,但是跳过匹配PATTERN的文件

1.2 常用选项

假设有文件datafile,其内容如下:

$cat datafile

47 Oct 3zl1998 LPSX 43.00 kvm90 512

48 Dec 3BC1997 LPSX 68.00 LVX2A138

219 Dec 2cc1999 CAD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

484 nov 7pl1996 CAD 49.00 PLV2C234

483 MAY 5PA1998 USP 37.00 KVM90 644

1.2.1 使用频率较高的常用选项

1.2.1.1 -v过滤匹配的行

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

示例:查找datafile文件中不包含“CAD”的所有行:

$grep -v "CAD" datafile

48 Dec 3BC1997 LPSX 68.00 LVX2A138

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

483 MAY 5PA1998 USP 37.00 KVM90 644

47 Oct 3zl1998 LPSX 43.00 kvm90 512

1.2.1.2 -l输出匹配的文件名

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

示例:查找包含字符串“LPSX”的文件名:

$grep -l "LPSX" *

datafile

1.2.1.3 -i 忽略大小写

-i 关闭大小写敏感性。

示例,查找含有“sep”这三个字符的行,并且不区分大小写:

$grep -i "sep" datafile

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

注:该表达式中sep包含任意大小写的组合都符合。

1.2.1.4 -n显示匹配行及行号

-n 显示匹配行及行号。

示例:查找datafile文件中含有“CAD”的所有行,并显示行号:

$grep -n "CAD" datafile

2:219 Dec 2cc1999 CAD 23.00 PLV2C68

5:484 nov 7pl1996 CAD 49.00 PLV2C234

1.2.2 其他常用选项

1.2.2.1 -c 输出匹配行的行数

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

示例:查找datafile文件中包含字符串“CAD”的行数:

$grep -c "CAD" datafile

2

1.2.2.2 -h不显示文件名

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

示例:打印含有字符串”Oct”所在的行内容,并且不显示其文件名:

$grep -h "Oct" *

47 Oct 3zl1998 LPSX 43.00 kvm90 512

1.2.2.3 -w输出完整匹配的行

-w 只选择含有能组成完整的词的匹配的行。

示例:打印完整组成“se”所在的行内容:

$grep "se" datafile

216 sept 3zl1998 usp 86.00 kvm9m234

$grep -w "se" datafile

1.3 其他选项

1.3.1 打印匹配行的上下文

l         -A NUM, --after-context=NUM

打印出紧随匹配的行之后的下文 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。

l         -B NUM, --before-context=NUM

打印出匹配的行之前的上文 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。

l         -C NUM, --context=NUM

打印出匹配的行的上下文前后各 NUM 行。在相邻的匹配组之间将会打印内容是 -- 的一行。

1.3.2 打印指定的匹配行数

l         -m NUM, --max-count=NUM

在找到NUM个匹配的行之后,不再读这个文件。如果输入是来自一个普通文件的标准输入,并且已经输出了NUM个匹配的行,grep保证标准输入被定位于退出时的最后一次匹配的行之后,不管是否指定了要输出紧随的下文的行。grep在NUM个匹配的行之后停止,它会输出任何紧随的下文的行。

1.3.3 递归模式匹配查找

l         -R/-r       递归地读每一目录下的所有文件;

l         -R/-r --include=PATTERN 仅仅在搜索匹配PATTERN的文件时在目录中递归搜索;

l         -R/-r --exclude=PATTERN  在目录中递归搜索,但是跳过匹配PATTERN的文件。

示例:grep忽略svn文件

1、使用管道进行双层“过滤”,其中第二次grep使用了-v选项,即逆向匹配,打印出不匹配的行,如下:

$grep -r 'function_name' * | grep -v '.svn'

2、直接使用--exclude-dir选项,即指定排除目录,注意svn前的 \.如下:

$grep -r --exclude =\.svn 'function_name' *

1.3.3.1 颜色标识查找结果

l         --color:将找到的字符串以特殊颜色显示

第2章 grep+正则表达式

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

2.1 正则表达式常用元字符

元字符

释义

^

只匹配行首

只匹配行尾

一个单字符后紧跟*,匹配0个或多个此单字符

[ ] 

匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用-表示[ ]内字符序列范围,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ]

用来屏蔽一个元字符的特殊含义。因为有时在shell中一些元字符有特殊含义。\可以使其失去应有意义

[^]

匹配不在指定字符组内的字符

\<

词首定位符

\>

词尾定位符

.

匹配任意单字符

x\{n\}

用来匹配字符x重复出现次数。n为次数

x\{n,\}

用来匹配字符x重复出现次数,但次数最少为n

x\{n,m\}

用来匹配字符x重复出现次数,但字符x出现次数在n与m之间

2.2 含有正则表达式的grep

假设有文件datafile:

$cat datafile

48 Dec 3BC1997 LPSX 68.00 LVX2A138

219 Dec 2cc1999 CADD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

484 nov 7pl1996 CAD 49.00 PLV2C234

483 MAY 5PA1998 USP 37.00 KVM90 644

47" Oct 3zl1998 LPSX 43.00 kvm90 512

2.2.1 字符匹配

示例:打印含有“CAD”字符串的所有行:

$grep 'CAD*' datafile

219 Dec 2cc1999 CADD 23.00 PLV2C68

484 nov 7pl1996 CAD 49.00 PLV2C234

示例:打印以“CADD”开头的字符串的所有行:

$grep '\<CADD' datafile

219 Dec 2cc1999 CADD 23.00 PLV2C68

示例:打印以“CAD”结尾的字符串的所有行:

$grep 'CAD\>' datafile

484 nov 7pl1996 CAD 49.00 PLV2C234

2.2.2 匹配特殊字符

\ 用来屏蔽一个元字符的特殊含义。因为有时在shell中一些元字符有特殊含义,\可以使其失去应有意义。

$grep \" datafile

47" Oct 3zl1998 LPSX 43.00 kvm90 512

$grep " datafile

2.2.3 范围组合

示例:打印以任意字符开始,第二位的范围为0-5,第三位的范围为5-9的字符串所在的行:

$grep '.[0-5][5-9]' datafile

48 Dec 3BC1997 LPSX 68.00 LVX2A138

219 Dec 2cc1999 CAD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

484 nov 7pl1996 CAD 49.00 PLV2C234

483 MAY 5PA1998 USP 37.00 KVM90 644

47" Oct 3zl1998 LPSX 43.00 kvm90 512

示例:打印以任意字符开始,第二位的范围为0-5,第三位的范围为5-9的并且处于行尾位置的三位数所在的行:

$grep '.[0-5][5-9]$' datafile

48 Dec 3BC1997 LPSX 68.00 LVX2A138

示例:打印以任意字符开始,第二位的范围不为0-5,第三位的范围为0-5的并且处于行首位置的三位数所在的行:

$grep '^.[^0-5][0-5]' datafile

483 SEPt 5ap1996 USP 65.00 LVX2C189

484 nov 7pl1996 CAD 49.00 PLV2C234

483 MAY 5PA1998 USP 37.00 KVM90 644

示例:打印以任意字符开始,第二位的范围为0-5,第三位的范围为0-5的并且处于行首位置的三位数所在的行:

$grep '^.[0-5][5-9]' datafile

219 Dec 2cc1999 CAD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

2.2.4 模式出现几率

示例:打印重复出现2次数字4所在的行:

$grep '4\{2\}' datafile

483 MAY 5PA1998 USP 37.00 KVM90 644

示例:打印至少重复出现3次数字9所在的行:

$grep '9\{3,\}' datafile

219 Dec 2cc1999 CAD 23.00 PLV2C68

示例:打印重复出现数字9的2到3次的行:

$grep '9\{2,3\}' datafile

48 Dec 3BC1997 LPSX 68.00 LVX2A138

219 Dec 2cc1999 CAD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

483 SEPt 5ap1996 USP 65.00 LVX2C189

484 nov 7pl1996 CAD 49.00 PLV2C234

483 MAY 5PA1998 USP 37.00 KVM90 644

47 Oct 3zl1998 LPSX 43.00 kvm90 512

2.2.5 匹配“与”或“或”模式

grep命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取219或216 所在的行,方法如下:

$grep -E "219|216" datafile

219 Dec 2cc1999 CAD 23.00 PLV2C68

216 sept 3zl1998 usp 86.00 kvm9m234

第3章 grep分类简述

grep家族由命令grep、egrep、fgrep组成。grep命令在文件中全局查找指定的正则表达式,并且打印所有包含该表达式的行。

  1. grep有两种版本:一种是标准的grep版本;另一种是扩展的 linux GNU grep。
  2. egrep是扩展的grep,支持更多的正则表达式元字符;

字符

释义

+

匹配一个或多个先前的字符,例如:’[a-z]+able’,则匹配一个或多个小写字母后跟able的串:loveable,enable,disable等

?

匹配零个或多个先前的字符,例如:’gr?p’,则匹配gr后跟一个或没有字符,然后是p的行

a|b|c

匹配a或b或c,例如:(grep)|(sed),则匹配grep或sed

()

分组符号,如:love(able|rs)ov+,则匹配loveableov或loversov

  1. fgrep被称为固定的grep(fixed grep),它按字面解释所有的字符。即正则表达式元字符不会被特殊处理,它们只匹配自己。
posted @ 2012-02-28 16:48  dmcpxy  阅读(5537)  评论(0编辑  收藏  举报