linux操作系统的一项重要的法则就是一切皆文件,然而对于初学者来说最头疼的一件事就是linux庞大文件系统的管理,对于一些文本文件的查找所搜等无从下手,特别是对于习惯于windows操作系统的大家来说会觉得查找是一件麻烦事,今天我就来给大家分享一些linux中强大的文本搜索工具。

   既然说到了文本搜索工具那就有必要说明一下它是什么,在linux上这种文本搜索工具就是根据用户指定的文本模式(搜索条件)对目标文件进行逐行搜索并且显示匹配到的行。它的工作方式与windows不同,它只显示匹配到搜索条件的那一行的信息,并不像windows那样在全文中把搜索关键字做特殊标记。

   当然了会有人说既然它不能显示全文并且标注我要找的关键字那我干嘛要用它,此工具就是为了应对那些文件内容相当多并且需要快速找到你要的重要信息这种事件。而且此命令不管是管理员还是普通用户都能使用,而且使用方法比较简单。



既然说了那么多它的好处那么接下来就要介绍它的使用方法:

grep:全称global search regular expression and print out the line

      即全局搜索正则表达式并输出到屏幕

语法格式为:grep 【选项】.. “搜索条件” 文件..

例如:我要搜索在/etc/passwd下的所有包含root的行

              

[jsh@localhost ~]$ grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[jsh@localhost ~]$




上述例子是不加选项用法

接下来给大家介绍grep的选项及用法:


【用法1】grep --color=auto “搜索条件” 文件

此选项是为搜索条件上色

例如:我们把上述例子匹配到的root着色为红色

linux之文本搜索工具(grep、egrep)用法_操作系统


【用法2】grep -v “搜索条件” 文件

此选项是取反的意思,就是现实搜索条件以外的内容。

例如:还是搜索/etc/passwd下不包含bash的行

linux之文本搜索工具(grep、egrep)用法_文本搜索工具_02


【用法3】grep -o “搜索条件” 文件

意为仅显示平匹配到的字串本身而非字串所在行

例如:只显示/etc/passwd中的root字串本身而非其所在行

linux之文本搜索工具(grep、egrep)用法_操作系统_03


【用法4】grep -i “搜索条件” 文件

意为不区分大小写搜索

例如:我们查看一下/tmp/ABC.txt文件中a所在的行

linux之文本搜索工具(grep、egrep)用法_文本搜索工具_04


【用法5】grep -A# “搜索条件” 文件(此处的#表示数字)

意为搜索匹配字符的所在行以及后#行

例如:linux之文本搜索工具(grep、egrep)用法_linux_05


【用法6】grep -B# “搜索条件” 文件(此处的#仍表示数字)

意为搜索匹配字符的所在行以及前#行

例如:

linux之文本搜索工具(grep、egrep)用法_操作系统_06


【用法7】grep -C# “搜索条件” 文件

意为搜索匹配字符的所在行以及前后#行

例如:

linux之文本搜索工具(grep、egrep)用法_linux_07


【用法8】grep -E “搜索条件” 文件    此命令相当于 egrep “搜索条件” 文件

意为使用扩展正则表达式。详细使用方法参照后文的扩展正则表达式。




  既然说到了正则表达式那就必须要给大家分享一下了,grepegrep都是支持基本正则表达式的,同时也支持扩展正则表达式。


   什么是正则表达式呢?

   所谓正则表达式:就是一类字符所书写的模式,其中的许多字符不表示其字面意义,而是表达控制或通配等功能。(即元字符)

   元字符:不表示字面意义,用于功能性描述。


正则表达式的元字符分为基本正则表达式元字符扩展正则表达式元字符,这两种元字符大体上相同用法也无大的差异。


基本正则表达式的元字符分为字符匹配元字符、次数匹配元字符、位置锚定元字符、分组元字符


    字符匹配元字符

                   . 意为匹配任意单个字符

                   [] 匹配指定范围内的任意单个字符 如:[0-9]表示0-9间的任意一个数字

                   [^]取反:匹配指定范围之外的字符 如:[^0-9]表示0-9以外的任意一个字符

                                                        次数匹配元字符:用于实现指定其前面                                                         的字符所能够出现的次数

                   * 它前面的字符可以出现任意次 如:.*表示任意长度任意字符(也可以是一次都                                                     未出现)

                   \? 表示前面的字符出现一次或零此(即可有可无) 如:x\?y所能匹配到的是xy、                                                                      y、ay

                   \{m\} 前面的字符出现m次 如:x\{2\}y所能匹配到的是xxy、xxxxyyy

                   \{m,n\}前面的字符至少出现m次且至多出现n次 如:x\{2,5\}y所能匹配到的是                                                                    xxxy、xxxxxyy

                   \{m,\}前面的字符至少出现m次,至多不限

                   \{0,n\}前面的字符至多出现n次

    位置锚定元字符

                   ^ 行首锚定(字符必须出现在行首)

                             如:查看/etc/passwd下以“r”开头中间隔两个字符第三个字符                                        为“t”的行


linux之文本搜索工具(grep、egrep)用法_linux_08

(值得注意的是grep的默认工作模式是贪婪模式,尽可能多的去匹配,如果把此实例稍作修改即可知晓,我们查看以"r"开头中间跟任意长度任意字符然后再跟"t"的行:linux之文本搜索工具(grep、egrep)用法_文本搜索工具_09

我们可以看到显示的第一行信息,匹配到root后并没有结束而是继续匹配root:x:0:0:root然后再去继续寻找后边有没有“t”然后就又匹配到了root:x:0:0:root:/root。由此说明当匹配到第一个“t”后grep并没有放弃,而是继续寻找后边有没有“t”)

                   $行尾锚定

                       如:查看/etc/passwd下以shutdown结尾的行

linux之文本搜索工具(grep、egrep)用法_文本搜索工具_10

                   ^$空白行

                   \<词首锚定(在linux中不包含特殊字符的连续字符组成的串叫单词)

                   \>词尾锚定

                   词首词尾锚定也可用\b单词\b这种形式

                       如:查看/etc/passwd下以root这个单词开头的行

linux之文本搜索工具(grep、egrep)用法_linux_11

   分组元字符

                \(组元素\)把括号内的组元素编排成一个组

                分组元字符一般结合引用一起使用,使用格式如下:

                  \(组元素\)     \#表示引用第#个括号内的内容(#表示数字)

                  注1:这里的括号是有次序的,自左到右的左括号以及与其匹配的右括号,如下:

                      \(abc\(dasf\(sada\)\(sajgj\)\)\)\3表示引用自左到右的第三个左括号内的                       内容,即引用\(sada\)内的内容

                      \(abc\(dasf\(sada\)\(sajgj\)\)\)\2表示引用自左到右第二个括号内的内                         容,即引用\(dasf\(sada\)\(sajgj\)\)内的内容。

                 注2:分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引                       用。




练习

     既然前边讲述了grep的用法和基本正则表达式,那么我们就来做几个练习题吧。

练习1:显示/proc/meminfo文件中以大写或小写s开头的行。

练习2:显示/etc/passwd文件中默认shell为/bin/bash的行。

练习3:找出/etc/passwd文件中的一位数或两位数的数字。

练习4:找出/etc/passwd文件中不是以/bin/bash结尾的行。







经过上边的练习相信大家一定会对grep有一个更深的了解,那么接下就给大家分享一下扩展正则表达式的用法吧。

 

   扩展正则表达式的字符有字符匹配元字符、次数匹配元字符、位置锚定元字符、分组匹配元字符

                          字符匹配元字符与基本正则表达式一样,这里就不多做介绍了

                          次数匹配元字符

                                         *表示前边字符出现任意次

                                         ?表示前边字符可有可无

                                         +表示前边字符至少出现1次

                                         {m}表示前边字符必须出现m次

                                         {m,n}表示前边字符至少出现m次,至多出现n次

                                         {m,}表示前边字符至少出现m次,至多不限

                                         {0,n}表示前边字符至多出现n次

                          位置锚定元字符

                                         ^行首锚定

                                         $行尾锚定

                                         \<或\b词首锚定

                                         \>或\b词尾锚定

                          分组匹配元字符

                                         ()

                                          \#引用第#个括号内的内容

                                          | 或者

                                             如:conc|Cat表示conc或者Cat

                                                 con(c)|(C)at表示concat或者conCat

扩展正则表达式的使用:grep -E 或者egrep



练习5:找出ifconfig命令结果中的1-255之间的数字。

练习6:找出/etc/init.d/functions文件中某个单词后跟一组括号“()”的行。








练习答案:(当然了此答案并不唯一,仅供参考)

1、

linux之文本搜索工具(grep、egrep)用法_文本搜索工具_12

2、

linux之文本搜索工具(grep、egrep)用法_操作系统_13

3、

linux之文本搜索工具(grep、egrep)用法_操作系统_14

4、

linux之文本搜索工具(grep、egrep)用法_linux_15

5、

linux之文本搜索工具(grep、egrep)用法_linux_16

6、

linux之文本搜索工具(grep、egrep)用法_文本搜索工具_17