grep的基本用法详解

 grep是linux上常用的一个文本处理工具之一。它有着强大的文本处理能力,学会它,可以让工作更有效率。

一、初识grep

  grep: Global search Regular Experssion and Print out line

  从名字上也可以直观的了解到它是基于正则表达式进行全局搜索,并把结果打印到屏幕上来。

  说白了,它就是根据用户指定的“模式(pattern)”来对文本进行过滤,并显示匹配到的行的文本搜索工具。


二、何为“模式”

  所谓模式,就是由一类字符书写,但是这些字符不表示字符本身字面的意义,而是表示控制或通配的功能。它还有一个高雅的名字,即正则表达式。


三、了解正则表达式

 1、基本的元字符

    .   匹配任意的字符

    *   匹配其前面的字符任意次数,0,1或多次

    \?  匹配其前面的字符0次或1次

    \+  匹配其前面的字符1次以上

  2、按字符匹配:

    .:   匹配任意单个字符

    []:   匹配指定集合中的任意单个字符

       常用的字符集合:

         [[:digit:]],[0-9]  表示0-9的任意数字

         [[:lower:]], [a-z]  表示26个小写英文字母

         [[:upper:]], [A-Z]  表示26个大写英文字母

         [[:alpha:]], [a-zA-Z] 表示所有英文字母

         [[:alnum:]], [[0-9a-zA-Z] 表示数字,所有英文字母

         [[:space:]]  表示空白字符

         [[:punct:]]  表示符号字符

    [^]:  匹配指定集合外的任意单个字符

  3、按匹配次数匹配:

   * : 匹配其前面任意字符任意次数

   \?: 匹配其前面的字符0次或1次

   \+: 匹配其前面的字符出现至少1次

   \{m\}: 匹配其前面的字符出现m次

   \{m,n\}: 匹配其前面的字符至少m次,至多n次

   .* : 常用组合,表示任意长度的任意字符

  4、实现位置锚定

   ^ : 写在模式的最左侧,表示锚定行首

   $ : 写在模式的最右侧,表示锚定行尾

   \<: 写在要查找的单词模式的左侧,做单词词首锚定

   \>: 写在要查找的单词模式的右侧,做单词词尾锚定

   ^$: 常用组合,表示空白行

   \<pattern\>: 匹配单词

  5、实现分组(只要功能可以用于实现后向引用)

    \(\): 在模式中,如果使用了分组,在某行文本检测中,如果\(\)匹配到了某内容,此内容可以在后面的模式中被引用。

    \# : 引用之前被\(\)所匹配到的内容,模式自左而右,引用第#个左括号以及其匹配右括号之间的模式匹配到的内容。


三、grep命令

  1、基本语法:  

     grep [OPTIONS] PATTERN [FILE…]

     常用选项:

       -i, –ignore-case  : 忽略字符大小写

       -o, –only-matching : 只显示被模式匹配到的内容

       -v, –invert-match : 反向选取,显示被模式匹配到的内容的相反内容

       -A #,–after-context=#: 显示被模式匹配到的行和此行之后的#行

       -B #,–before-context=#: 显示被模式匹配到的行和此行之前的#行

       -C #,–context=#: 显示被模式匹配到的行和此行前后的#行 

       -r, -R, –recursive: 递归查询,对目录下的子目录也会进行查询

       -E, –extended-regexp: 使用扩展正则表达式进行匹配,相当于egrep

       -F, –fixed-strings: 不使用正则表达式经行匹配,即忽略元字符的意义,相当于fgrep

       –color={never,always,auto}:可以设置颜色显示,可以进行别名,方便使用。例如:alias grep='grep –color=auto'


四、知识点练习

接下来我们以以下文本文件的内容来进行练习

blob.png

练习1:显示b出现3次以上的行

grep "b\{3,\}" test.txt

blob.png

练习2:统计文本文件中work|WORK出现的次数

grep -i -o "\<work\>" test.txt | wc -l

blob.png

练习3:显示所有包含符号的行

grep "[[:punct:]]" test.txt

blob.png

练习4:找出其中最后一个单词是由此前某单词加er构成的行。

grep "\(\<[[:alpha:]]\+\>\).*\1er" test.txt

blob.png


五、实际的应用

有了以上的知识储备,我们就可以用grep来进行一些基本的处理工作了。

1、在/etc/passwd上查找以/sbin/nolog结尾的行,即可以使用以/bin/nologin为结束的位置锚定进行选取

grep "/sbin/nologin$" /etc/passwd

QUAU2MM7V8]U3NFFHV[[CK2.png

2、在/etc/passwd上查找用户id和组id在500到1099之间的行

grep "\<1\?[05][0-9][0-9]\>" /etc/passwd

blob.png

3、查找当前系统上网卡驱动程序的名称

#显示pci设备中网卡的信息
#最前面的 “02:01.0” 就是设备在PCI总线上的代号,该代号在整个系统中是唯一的。(因为当前系统上有两块网卡,所以有两条信息)
[root@localhost tmp]# lspci | grep "Ethernet"
02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
02:05.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)

#sys目录是内核将设备信息映射出来的一个伪文件系统,所以我们查找到的那一行信息中drivers的子目录e1000即是网卡设备的驱动名称
[root@localhost tmp]# find /sys/bus/pci/drivers | grep "02:01.0"
/sys/bus/pci/drivers/e1000/0000:02:01.0

其实要做的事也就2步,然后我们可以把这些命令通过管道(|)来把命令连接起来,实现功能。

blob.png

原创文章,作者:封于修,如若转载,请注明出处:http://www.178linux.com/4746

(0)
封于修封于修
上一篇 2015-05-23
下一篇 2015-05-25

相关推荐

  • Mysql 多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如:  SELECT * FROM table1 CROSS JOIN table2  &nb…

    Linux干货 2015-04-13
  • 基于rsync+inotify实现数据实时同步传输

    前言 与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,但随着文件数量的增大和实时同步的要求,rsync已不能满足需求,随之rsync+inotify便应运而生。本文将讲解rsync的基础知识和如何基于rsync+inotify实现数据实时同步传输。 rsync相关介…

    Linux干货 2015-04-27
  • 正则表达式简述

    正则表达式简述 什么是正则表达式: 正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 正则表达式分类: 标准正…

    Linux干货 2016-04-05
  • 推荐-File System manager

    文件系统(File system) :     文件系统概要    文件系统的分类    文件系统的管理工具             mkfs btrfs ext xfs&nbsp…

    Linux干货 2016-03-26
  • Liunx权限的管理

    一、权限 获取某种资源的能力。对于Liunx而言,一切皆文件。所以,对于Liunx的权限定义,也就是定义文件被不同用户访问能力的过程。 权限分为三种:r、w、x 文件 r:查看文件内容 w:修改文件内容 x:可以将文件启动运行 目录 r:可以使用ls命令查看目录中的文件名 w:可以在目录中创建或删除文件(能否删除文件,取决于用户对目录的写权限 x:可以cd到…

    Linux干货 2015-04-03
  • 谈谈对于vmware Workstation 网络连接三种模式的认识.

    简介: VM(VMware Workstation简称VM,后面都将用VM代替阐述)是一款功能强大的虚拟化软件.VM支持在 单一的桌面上同时运行多款不同的操作系统,能够模拟完整的网络环境,支持pxe功能.实时快照,等等多种强 大的功能.能够测试软件和部署新的业务测试.同时节约了很多资源.节约了企业成本.所以对于广大的互联网 从业者是不可多得的好工具. 本文中…

    Linux干货 2015-08-24

评论列表(7条)

  • stanley
    stanley 2015-05-25 20:52

    才知道封于修不仅武功厉害,文章也相当牛了

    • 封于修
      封于修 2015-05-26 20:02

      @stanley谢谢stanley大哥,不过我还有好长的路需要努力…呵呵

  • 老鼠上了猫
    老鼠上了猫 2015-06-23 17:04

    2、在/etc/passwd上查找用户id和组id在500到1099之间的行
    grep “\” /etc/passwd
    这样取是有问题的,[05]是取0或5,那ID为600-1000间的用户是取不到的。
    中括号只能取一位数,我也不知道怎么取。

    • 封于修
      封于修 2015-06-26 23:03

      @老鼠上了猫你说的对,我没有考虑清楚。其实严谨的写grep -E “[5-9][0-9][0-9]|10[0-9][0-9]” /etc/passwd 应该才是对的。

    • 老鼠上了猫
      老鼠上了猫 2015-06-29 16:23

      @封于修你这是用户IP或组ID为500-1099:
      grep -e “[5-9][0-9][0-9]” -e “10[0-9][0-9]” /etc/passwd 这样也可以
      如果需满足用户IP和组IP为500-1099的话,只用grep想不出怎么匹配,用awk就比较简单了:
      awk -F: ‘$3>=500 && $4<=1099 {print $0}' /etc/passwd

    • 封于修
      封于修 2015-06-29 19:21

      @老鼠上了猫条件式的判断选取用awk是会更好。
      grep其实也是可以的,就是会很麻烦。
      grep -E “[^:]+:[^:]+:([5-9][0-9][0-9]|10[0-9][0-9]):([5-9][0-9][0-9]|10[0-9][0-9]):.*” /etc/passwd
      我试了一下,这样写也是可以匹配得到的。或许会有更简便的写法,只能等大神解答了。

    • 老鼠上了猫
      老鼠上了猫 2015-06-29 19:30

      @封于修整行匹配肯定没问题的,这也是一思路,赞!