设为首页 收藏本站
查看: 533|回复: 0

[经验分享] linux之文本搜索工具(grep、egrep)用法

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-15 14:23:17 | 显示全部楼层 |阅读模式
  linux操作系统的一项重要的法则就是一切皆文件,然而对于初学者来说最头疼的一件事就是linux庞大文件系统的管理,对于一些文本文件的查找所搜等无从下手,特别是对于习惯于windows操作系统的大家来说会觉得查找是一件麻烦事,今天我就来给大家分享一些linux中强大的文本搜索工具。
   既然说到了文本搜索工具那就有必要说明一下它是什么,在linux上这种文本搜索工具就是根据用户指定的文本模式(搜索条件)对目标文件进行逐行搜索并且显示匹配到的行。它的工作方式与windows不同,它只显示匹配到搜索条件的那一行的信息,并不像windows那样在全文中把搜索关键字做特殊标记。
   当然了会有人说既然它不能显示全文并且标注我要找的关键字那我干嘛要用它,此工具就是为了应对那些文件内容相当多并且需要快速找到你要的重要信息这种事件。而且此命令不管是管理员还是普通用户都能使用,而且使用方法比较简单。
   既然说了那么多它的好处那么接下来就要介绍它的使用方法:
grep:全称global search regular expression and print out the line
      即全局搜索正则表达式并输出到屏幕
其语法格式为:grep 【选项】.. “搜索条件” 文件..
        例如:我要搜索在/etc/passwd下的所有包含root的行
              
1
2
3
4
[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的选项及用法:
grep --color=auto “搜索条件” 文件
此选项是为搜索条件上色
例如:我们把上述例子匹配到的root着色为红色
wKiom1PCRVvgiaS0AACPOG0yS5U980.jpg grep -v “搜索条件” 文件
此选项是取反的意思,就是现实搜索条件以外的内容。
例如:还是搜索/etc/passwd下不包含bash的行
wKiom1PCRlqQSdZHAASuk9qgzJo298.jpg grep -o “搜索条件” 文件
意为仅显示平匹配到的字串本身而非字串所在行

例如:只显示/etc/passwd中的root字串本身而非其所在行
wKiom1PCRzvjU4w3AADOdZsDyIw095.jpg
grep -i “搜索条件” 文件

意为不区分大小写搜索

例如:我们查看一下/tmp/ABC.txt文件中a所在的行
wKioL1PCSLLA_mHeAAEdSU0xnq4718.jpg
grep -A# “搜索条件” 文件(此处的#表示数字)
意为搜索匹配字符的所在行以及后#行
例如: wKiom1PCS-bwRxwRAAB_p_MSkYE128.jpg
grep -B# “搜索条件” 文件(此处的#仍表示数字)
意为搜索匹配字符的所在行以及前#行
例如:
wKiom1PCTGmTuVcVAABrcz-bFGU261.jpg
grep -C# “搜索条件” 文件
意为搜索匹配字符的所在行以及前后#行
例如:
wKioL1PCTKaRB6x0AAB_lXbsllI026.jpg
grep -E “搜索条件” 文件    此命令相当于 egrep “搜索条件” 文件
意为使用扩展正则表达式。详细使用方法参照后文的扩展正则表达式。



   既然说到了正则表达式那就必须要给大家分享一下了,grep和egrep都是支持基本正则表达式的,同时也支持扩展正则表达式。
   什么是正则表达式呢?
   所谓正则表达式:就是一类字符所书写的模式,其中的许多字符不表示其字面意义,而是表达控制或通配等功能。(即元字符)
   元字符:不表示字面意义,用于功能性描述。

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

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

    字符匹配元字符:
                   . 意为匹配任意单个字符
                   [] 匹配指定范围内的任意单个字符 如:[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”的行 wKiom1PCVe2hWkauAABscL3DOpo135.jpg
(值得注意的是grep的默认工作模式是贪婪模式,尽可能多的去匹配,如果把此实例稍作修改即可知晓,我们查看以"r"开头中间跟任意长度任意字符然后再跟"t"的行: wKioL1PCV7KQMzfEAAHsbHgYTL0800.jpg
我们可以看到显示的第一行信息,匹配到root后并没有结束而是继续匹配root:x:0:0:root然后再去继续寻找后边有没有“t”然后就又匹配到了root:x:0:0:root:/root。由此说明当匹配到第一个“t”后grep并没有放弃,而是继续寻找后边有没有“t”)
                   $行尾锚定
                       如:查看/etc/passwd下以shutdown结尾的行
wKiom1PCY3DRM_6-AAB1gA301Ng989.jpg
                   ^$空白行
                   \<词首锚定(在linux中不包含特殊字符的连续字符组成的串叫单词)
                   \>词尾锚定
                   词首词尾锚定也可用\b单词\b这种形式
                       如:查看/etc/passwd下以root这个单词开头的行
wKioL1PCZNuD31UKAADDN-YbODk988.jpg
   分组元字符:
                \(组元素\)把括号内的组元素编排成一个组
                分组元字符一般结合引用一起使用,使用格式如下:
                  \(组元素\)     \#表示引用第#个括号内的内容(#表示数字)
                  注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、
wKioL1PCcEDzGLhGAAEyknT6r-0715.jpg
2、
wKioL1PCcNOj9AI_AAC2bLSeZGw898.jpg
3、
wKioL1PCcYSzVawEAAPW10Ya1-A332.jpg
4、
wKiom1PCckHi-wBSAATE9s1PiGU511.jpg
5、
wKioL1PCcuqTDaLGAADQwveQ_Fs508.jpg
6、
wKiom1PCdAGBVgE8AAHbCOBe1N8660.jpg




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-22114-1-1.html 上篇帖子: linux shell中的比较符号与特殊符号介绍 下篇帖子: Linux中 文本处理命令 grep egrep fgrep的使 linux
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表