视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Grep 命令语法
2025-09-27 00:15:14 责编:小OO
文档
Grep 命令语法2010-07-24 17:19Linux命令:grep 

功能说明:查找文件里符合条件的字符串。 

语  法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] [-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...] 

补充说明:

grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为“-”,则grep指令会从标准输入设备读取数据。 

参  数:

-a或--text 不要忽略二进制的数据。

-A<显示列数>或--after-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之後的内容。

-b或--byte-offset 在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。

-B<显示列数>或--before-context=<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前的内容。

-c或--count 计算符合范本样式的列数。

-C<显示列数>或--context=<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前後的内容。

-d<进行动作>或--directories=<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。

-e<范本样式>或--regexp=<范本样式> 指定字符串做为查找文件内容的范本样式。

-E或--extended-regexp 将范本样式为延伸的普通表示法来使用。

-f<范本文件>或--file=<范本文件> 指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。

-F或--fixed-regexp 将范本样式视为固定字符串的列表。

-G或--basic-regexp 将范本样式视为普通的表示法来使用。

-h或--no-filename 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。

-H或--with-filename 在显示符合范本样式的那一列之前,表示该列所属的文件名称。

-i或--ignore-case 忽略字符大小写的差别。

-l或--file-with-matches 列出文件内容符合指定的范本样式的文件名称。

-L或--files-without-match 列出文件内容不符合指定的范本样式的文件名称。

-n或--line-number 在显示符合范本样式的那一列之前,标示出该列的列数编号。

-q或--quiet或--silent 不显示任何信息。

-r或--recursive 此参数的效果和指定“-d recurse”参数相同。

-s或--no-messages 不显示错误信息。

-v或--revert-match 反转查找。

-V或--version 显示版本信息。

-w或--word-regexp 只显示全字符合的列。

-x或--line-regexp 只显示全列符合的列。

-y 此参数的效果和指定“-i”参数相同。

--help 在线帮助。

1. grep简介

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包 括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能 更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

2. grep正则表达式元字符集(基本集)

^            锚定行的开始 如:'^grep'匹配所有以grep开头的行。 

$           锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 

.            匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。 

*           匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。 .*一起用代表任意字符。 

[]           匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。 

[^]         匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 

\\(..\\)      标记匹配字符,如'\\(love\\)',love被标记为1。 

\\< 锚定单词的开始,如:'\\\\> 锚定单词的结束,如'grep\\>'匹配包含以grep结尾的单词的行。 

x\\{m\\}            重复字符x,m次,如:'0\\{5\\}'匹配包含5个o的行。 

x\\{m,\\}            重复字符x,至少m次,如:'o\\{5,\\}'匹配至少有5个o的行。 

x\\{m,n\\}            重复字符x,至少m次,不多于n次,如:'o\\{5,10\\}'匹配5--10个o的行。 

\\w       匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。 

\\W       w的反置形式,匹配一个或多个非单词字符,如点号句号等。 

\\b        单词锁定符,如: '\\bgrep\\b'只匹配grep。  

 

3. 用于egrep和 grep -E的元字符扩展集

+            匹配一个或多个先前的字符。如:'[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+匹配loveable或lovers,匹配一个或多个ov。 

x{m},x{m,},x{m,n}            作用同x\\{m\\},x\\{m,\\},x\\{m,n\\}  

4. POSIX字符类

为 了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是A-Za-z0-9的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。

[:alnum:            文字数字字符 

[:alpha:]            文字字符 

[:digit:]            数字字符 

[:graph:]            非空字符(非空格、控制字符) 

[:lower:]            小写字符 

[:cntrl:]            控制字符 

[:print:]            非空字符(包括空格) 

[:punct:]            标点符号 

[:space:]            所有空白字符(新行,空格,制表符) 

[:upper:]            大写字符 

[:xdigit:]            十六进制数字(0-9,a-f,A-F)  

5. Grep命令选项

-?            同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。 

-b,--byte-offset            打印匹配行前面打印该行所在的块号码。 

-c,--count            只打印匹配的行数,不显示匹配的内容。 

-f File,--file=File            从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。 

-h,--no-filename            当搜索多个文件时,不显示匹配文件名前缀。 

-i,--ignore-case        &nb 

sp;   忽略大小写差别。 

-q,--quiet            取消显示,只返回退出状态。0则表示找到了匹配的行。 

-l,--files-with-matches            打印匹配模板的文件清单。 

-L,--files-without-match            打印不匹配模板的文件清单。 

-n,--line-number            在匹配的行前面打印行号。 

-s,--silent            不显示关于不存在或者无法读取文件的错误信息。 

-v,--revert-match            反检索,只显示不匹配的行。 

-w,--word-regexp            如果被\\<和\\>引用,就把表达式做为一个单词搜索。 

-V,--version            显示软件版本信息。  

 

6. 实例

要用好grep这个工具,其实就是要写好正则表达式,所以这里不对grep的所有功能进行实例讲解,只列几个例子,讲解一个正则表达式的写法。

$ ls -l | grep '^a'            通过管道过滤ls -l输出的内容,只显示以a开头的行。 

$ grep 'test' d*            显示所有以d开头的文件中包含test的行。 

$ grep 'test' aa bb cc            显示在aa,bb,cc文件中匹配test的行。 

$ grep '[a-z]\\{5\\}' aa            显示所有包含每个字符串至少有5个连续小写字符的字符串的行。 

$ grep 'w\\(es\\)t.*\\1' aa            如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(\\1),找到就显示该行。如果用egrep或grep -E,就不用"\\"号进行转义,直接写成'w(es)t.*\\1'就可以了。 

再讲解一个具体应用的例子。

查询所有位于当前目录下的.cs文件中的Main,通过grep,可以轻松快速地完成这项任务,命令如下: 

grep ‘Main’ *.cs

输出结果为:

ChineseDemo.cs:  public static void Main()

RegDemo1.cs:  static void Main(string[] args)

RegDemo2.cs:  public static void Main()

RegDemo3.cs:  public static void Main()

    可见,通过grep真的可以找到相关目录中符合条件的所有文件,并能打印出查询到的字符串所位于的那行内容。如果只想确定哪些文件含有Main,而不需打印相应行的内容,那么可以使用以下命令:?

grep –l ‘Main’ *.cs

输出结果为:

ChineseDemo.cs

RegDemo1.cs

RegDemo2.cs

RegDemo3.cs

只有相应的文件名称被显示。

    在找到了含有Main字符串的几个文件后,如果想粗略地查看某一具体文件的里源代码的相关信息,比如查看RegDemo1.cs文件中含有Main这一行的前后三行,相关的命令如下:

grep –C 3 ‘Main’ RegDemo1.cs

输出结果为:

class GroupingApp

{

   static void Main(string[] args)

   {

 Reg7();

 }

输出结果完全符合需求,static void Main(string[] args)这一行前后三行范围内的所有代码被全部打印出来(第一行是空行)。

    以上的查询字符串没有对查找结果是否为一个完整的单词进行,也就是说TheMain和Main_Func都会被认定为查询目标。如果想限定该查询字符串为一个完整单词,那么可以使用\\w参数,相关命令如下:

grep –w ‘Main’ *.cs

结果为:

ChineseDemo.cs: public static void Main()

RegDemo1.cs: static void Main(string[] args)

RegDemo2.cs: public static void Main()

RegDemo3.cs: public static void Main()下载本文

显示全文
专题