`

Linux命令详解 - grep

 
阅读更多

Linux命令详解 - grep

按照我们以前学习Linux命令的套路,我们习惯于先man一下,看下系统怎么解释这个命令。详细的文档参考这里:http://www.gnu.org/software/grep/manual/grep.html

系统的解释:

grep, egrep, fgrep - print lines matching a pattern

这个解释还是比较明晰的,打印匹配给定模式的行数

这里先提一下,上面提到了egrep、fgrep,这两个grep命令是由于历史的原因还依然存在,egrep=grep -E,fgrep=grep -F实际上是已经废弃了的命令,不再推荐使用

 

grep命令及其强大,按照参数控制的不同,分为几个方面:

Matcher Selection:匹配模式选择
Matching Control:匹配控制
General Output Control:通用输出控制
Output Line Prefix Control:输出内容控制
Context Line Control:内容输出行控制
File and Directory Selection:文件、目录选择
Other Options:其它选项

我们按照grep的各个方面来学习一下grep命令。

 

先看下Matcher Selection,选择合适的匹配器,grep支持四种匹配匹配选择:

-E:Extended Regular Expression,扩展正则
-F:Fixed String:固定的String模式
-G:Basic Regular Pattern:基本模式,默认
-P:Perl regular expression:支持Perl匹配

 

 选择合适的匹配模式,就可以按照选择方式进行匹配了。

关于Matching Controlgrep支持下面几个参数控制:

 

   -e:PATTERN,支持使用-e参数,将PATTERN作为匹配的内容,PATTERN支持多个匹配内容
   -f:FILE,匹配模式从内容读取,每行一个匹配模式,如果文件为空的话,会匹配不出结果
   -i:这个最常见,表示匹配时不区分大小写
   -w:表示单词匹配,必须是单个词匹配上才算
   -x:这个表示是行匹配,必须是正行匹配上PATTERN才算
   -y:意义和-i一致,不过已经废弃了。

 

下面看下General Output Control,这个是控制输出的结果,实际上就是控制输出的一些内容:

 

   -c:这个参数会把其它的输出给去除,只剩下匹配的行数,如果添加-v参数,会输出没有匹配的行数
   -L:这个参数比较拗口,是输出没有匹配出内容的文件,换句话说,如果文件中有PATTERN符合要求,就不会输出文件名;另外值得一提的是,这个匹配只要匹配到首个符合PATTERN的内容就结束,不会继续进行。
   -l:和-L相反
   -m:NUM,控制最大匹配的行数NUM,grep能够控制最大输出不超过NUM行,加上-v参数的话,会输出最大NUM的非匹配行,如果是-c参数呢?读者可以自行学习下。
   -o:打印非空匹配部分,注意是只打印匹配的内容,不会打印整行内容
   -q:quiet,不打印任何内容,如果匹配找到立即返回0,即使有错误的话,也会立即返回
   -s:对于nonexistent和unreadable错误不会打印错误信息;注意该参数是在grep版本表现不一样,尤其要区别GNU版本和Unix版本的区别

 

上面的General Output Control是控制通用的输出,其实就是一些比较常见的输出控制,下面这个Output Line Prefix Control控制更为详细的信息,算是比较高级的内容。

   -b:打印byte偏移量输出,匹配的没个结果相对于文件开头的byte偏移。
   -H:打印匹配的每行的文件名,当有多个文件查找时这个是默认配置。
   -h:不会打印匹配的所在文件名,这个在单个文件查找时是默认配置
   -n:打印行数
   -T:
   -u:Unix-Style byte偏移量,将查找作为Unix style grep,最简单的例子就是CRLF等字符;如果有-b参数的话,-u参数不管用,另外-u参数只在windows情况下有效。
   -Z:会在输出的文件名之后输出一个Zero byte,而不是默认的:,这个参数比较让人困惑,不用也罢。

 

上面的Output Line Prefix Control控制信息也比较易于理解, 就是控制的一些输出控制;如果想对匹配的PATTERN信息控制,看下Context Line Control,这个控制信息是控制匹配行之后的输出信息

   -A:NUM,打印匹配行之后的NUM行信息;
   -B:NUM,打印匹配行之前的NUM行信息;
   -C:NUM,打印出包括匹配航在内的NUM行输出,--分割匹配一组匹配结果

 这组Output Line Prefix Control参数还是比较好用的。

 

File and Directory Selection这组参数是控制文件选择的,直接看下面的参数吧.

   -a:将二进制文件看做是text文件,相当于--binary-files=text的情况
   binary-files=TYPE:TYPE的值可以为binary、without-match、text,默认是binary;如果使用text的话,可能会有乱码输出
   -D:ACTION,输入可以为Device、FIFO、Socket等,使用该参数去处理这些输入;如果ACTION=read,这些输入源就好像和普通文件一样,如果ACTION=skip,不处理这些输入源。
   --exclude=glob:跳过符合glob匹配的文件,其中glob可以使用匹配符
   --exclude-from=file:这个是讲glob的内容放在file中,跳过符合这些匹配符匹配的文件。
   --exclude-dir=dir:跳过dir目录内容匹配。
   -I:相当于--binary-files=without-match
   --include=glob:指搜索符合glob匹配的文件,当然glob也可以使用匹配符
   -r:迭代处理目录下的文件,软连接会被跳过
   -R:跟-r参数一致,不过会处理软连接下的内容

 

除去上面的这些内容,还有一些Other Options可供选择

   --line-buffered:匹配输出buffered,有可能会引起性能问题
   --mmap:强制系统使用mmap读取文件,替代系统命令read读取,不过在现在系统下,mmap能够获得的性能提升有限,还有可能会引起潜在的问题:如IO Error、读取时文件内容变化等

 

提到grep的另外一个强大之处就是对于正则的支持,归于正则表达式大家想必都不陌生,这里只是简单提一下,仅供以后参考:

下面这些正则内容,grep都支持:

   *      The preceding item will be matched zero or more times.
   +      The preceding item will be matched one or more times.
   {n}    The preceding item is matched exactly n times.
   {n,}   The preceding item is matched n or more times.
   {,m}   The preceding item is matched at most m times.
   {n,m}  The preceding item is matched at least n times, but not more than m times.

如果想匹配?*.+{}[]()这些字符,请用反斜杠转义。

 

说到了反斜杠,还要提一下正则表达式中的Backslash Expression,这个是我们在写正则时最常用的表达式:

   \b:字符边界表示,这个表达式会将匹配的结果看做一个单词,而不会在单词中匹配结果
   \B:字符非边界表示,匹配必须出现在单词中
   \w:匹配所有的[a-zA-Z_0-9]
   \W:非\w
   \s:匹配空白字符
   \S:非\s

 注意,grep还支持这两个匹配字符\<和\> 转义,这两个也是匹配字符边界的,我看官方文档和\b没有区别,只是\b单个就能表达前后边界,而\<表示字符前面的边界,\>表示字符后面的边界。

 

另外grep还预定义了一些括号表达式,这些 grep预定义的表达式和常规的正则表达式意义一样,只是内容更丰富、控制更加细致;常用的又这些:

   [:alnum:]:[:alpha:]和[:digit:]的字符集合
   [:alpha:]:[:lower:]和[:upper:]的字符集合,[a-zA-Z]
   [:blank:]:Space和Tab键
   [:cntrl:]:ASCII表中从000到037的字符,再加上177(DEL),注意是八进制
   [:digit:]:数字,[0-9]
   [:graph:]:[:alnum:]和[:punct:]的字符集合
   [:lower:]:[a-z],小写字母
   [:print:]:可打印字符,[:alnum:]和[:punct:]的字符集合
   [:punct:]:符号字符,都有!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
   [:space:]:CRLF、Tab等不可见字符
   [:upper:]:[A-Z],大写字母
   [:xdigit:]:Hexadecimal digit,[0-9a-fA-F],十六进制数
   

 大家对比下上面两个内容,看看正则表达式的BackSlash Expressiongrep的预定义表达式的区别。

 

 

grep命令非常的强大,能帮助我们做很多事;尤其在处理日志、查询内容,完成正常工作内容时。所以努力学习grep,加上以前的sortuniq,处理日志就是一把瑞士军刀,无往不胜。

哈哈,瑞士军刀有点过了,不过处理日常工作绰绰有余;grep命令参数太多,我也是查的次数太频繁,某些高级参数用到时经常有点模糊才总结了这篇文章。

 

 

分享到:
评论

相关推荐

    linux命令详解---超值哟

    这份"linux命令详解---超值哟"的PDF文档无疑是一份非常实用的学习资料,它深入浅出地介绍了Linux命令及其参数的用法。 Linux命令大致分为文件和目录管理、文本处理、系统管理、网络通信以及程序控制等几大类。下面...

    linux-grep-命令-详解.zip

    这个压缩包“linux-grep-命令-详解.zip”包含了一份详细文档“linux-grep-基本用法及高级技巧.doc”,将深入解析grep命令的各个方面。下面,我们将根据文档内容,对grep命令进行详细介绍。 grep,顾名思义,“g/re/...

    linux grep命令详解

    ### Linux 下 `grep` 命令详解 `grep` 是 Linux 下一款强大的文本搜索工具,可以在文件中搜索固定字符串或者使用正则表达式搜索,是日常开发、运维工作中非常实用的一个命令。本文将详细介绍 `grep` 的常用选项及其...

    linux ps 命令详解

    **Linux `ps` 命令详解** 在Linux操作系统中,`ps`(Process Status)命令是用于查看系统当前进程状态的工具。它能够显示进程的实时信息,帮助用户了解系统的运行情况,进行进程管理。`ps`命令历史悠久,功能强大,...

    Linux Find命令详解---教你认识强大的Linux Find命令

    Linux Find命令是Linux系统中一个极其重要的工具,它允许用户在文件系统...在实际工作中,可以结合其他命令如`grep`、`awk`等,构建更复杂的文件查找和处理流程。希望这个指南能帮助你更好地理解和运用Linux Find命令。

    Linux中grep命令参数及用法详解---linux管道命令grep

    ### Linux中的`grep`命令参数及用法详解 `grep`是Linux系统中非常重要的文本搜索工具之一,它能够帮助用户高效地查找文件中的特定模式或字符串。`grep`不仅适用于简单的文本匹配,还能处理复杂的正则表达式,是进行...

    grep用法详解---grep与正则表达式

    `grep`命令用于在文件中查找匹配特定模式的行。基本语法为`grep [-选项] '搜索内容串' 文件名`。以下是一些常用选项: - `-a`:将二进制文件当作文本处理。 - `-c`:计算匹配行的数量。 - `-i`:忽略大小写。 -...

    Linux常用命令详解-不带书签高清版本

    这份名为“Linux常用命令详解-不带书签高清版本”的文档,很显然是为了帮助用户深入理解和掌握这些命令而编写的。它提供了高清的阅读体验,使得文字可以被轻松复制,这对于学习和查找特定命令的用法非常方便。 ...

    linux命令详解阿手册PDF文档

    《Linux命令详解手册》是一份全面的Linux命令参考资料,它详细介绍了Linux系统中广泛使用的一系列命令,覆盖了系统管理、系统设置、文档编辑以及压缩备份等多个方面。为了方便用户查阅,该手册按照命令的功能进行了...

    linux grep命令详解_linux_grep_

    Linux中的`grep`命令是文本处理工具中的重要一员,它在系统管理和日常工作中发挥着巨大的作用。`grep`源自于“global regular ...希望这份`grep`命令详解能帮助初学者快速入门,并逐渐精通Linux文本处理技巧。

    Linux grep 命令详解

    Linux grep 命令详解 Linux 中的 grep 命令是一种功能强大的文本搜索工具,通过模式匹配来查找文件中的内容。grep 命令可以根据用户的需求来查找特定的字符串、数字或正则表达式。 grep 命令的基本格式 grep ...

    Linux命令详解手册

    Linux命令详解手册是一本适合Linux新手和有一定基础的用户深入学习Linux命令的指南。它详细介绍了大量的Linux命令,涵盖了系统管理、系统设置、文档编辑以及压缩备份等多个方面的操作。掌握这些命令对于理解和使用...

    Linux ps命令详解

    Linux ps 命令详解 Linux ps 命令是一种强大的进程查看命令,可以确定有哪些进程正在运行、进程是否结束、进程是否僵死、哪些进程占用了过多的资源等等。ps 命令最经常使用的是用于监控后台进程的工作情况,因为...

    大数据基础-Linux基础详解课程29.基本命令-grep命令.mp4

    大数据基础-Linux基础详解课程

    Linux下的ps aux命令详解

    `ps aux`是Linux系统中一个非常常用的命令,用于查看系统中当前运行的进程状态。这个命令可以帮助系统管理员和开发者了解系统的运行情况,监控资源使用,查找问题,以及调试程序。下面将详细介绍`ps aux`命令及其...

    [Linux命令详解词典]

    《Linux命令详解词典》是由施威铭研究室编著的一本详尽解析Linux命令的参考书籍,旨在帮助用户深入理解和掌握Linux操作系统中的各种命令。这本书以扫描版的形式提供,包含PDF格式,方便读者在线阅读或下载。标签...

    Linux命令详解词典(绝版)

    《Linux命令详解词典(绝版)》作为施威铭研究室所著的一本经典Linux工具书,主要针对Linux操作系统中的各种命令进行了深入的解释和阐述。Linux作为一种自由和开放源代码的类Unix操作系统,广泛应用于服务器、桌面、...

    linux命令详解词典

    这份“Linux命令详解词典”由施威铭研究室提供,涵盖了Linux系统下的所有基本及高级操作命令,对于学习和理解Linux系统的管理至关重要。下面将详细阐述一些关键的Linux命令。 1. **ls**:列出目录内容。`ls`命令...

    Linux命令详解词典.pdf

    《Linux命令详解词典》是一本详尽解析Linux操作系统中常用命令的参考书籍。Linux作为开源、免费的操作系统,其强大的命令行工具是其高效工作的重要组成部分。这本书旨在帮助用户理解和掌握这些命令,从而更好地在...

Global site tag (gtag.js) - Google Analytics