彻底理解grep命令

1.1 grep命令简介

    grep (global search regular expression(RE) and print out the line,是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。

1.2 grep工作过程

    grep命令将逐行读入文件内容至模式空间,按照给定的pattern进行匹配。

  1. 如果该行内容能够被指定的pattern匹配,复制该行内容到标准输出,并且读入文件的下一行。
  2. 如果该行内容不能被指定的条件匹配,删除此行,读取下一行内容。
  3. 对于匹配结果来说,grep默认工作在贪婪模式下,会对符合匹配结果的字符串尽可能长的匹配。匹配的一行内容中可能出现整个字符串是不符合匹配结结果的,但这个字符串部分内容又能够被匹配到。

1.3 grep语法格式:

grep [options] pattern input_file_names
选项可以有零个或多个。

--color=auto: 对匹配到的文本着色显示
-m # 匹配#次后停止
-v 显示不被pattern匹配到的行
-I 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系
-w 匹配整个单词
-E 使用扩展正则表达式
-F 相当于fgrep,不支持正则表达式
-f file 根据模式文件处理

1.4 grep示例

  1. grep查找ssh相关进程,结果中为什么存在有grep进程出现呢?

    [19:58:31 root@centos7 /]#ps aux | grep sshd  
    root       6971  0.0  0.2 112756  4304 ?        Ss   08:43   0:00 /usr/sbin/sshd -D  
    root       7393  0.0  0.2 160848  5732 ?        Ss   08:44   0:09 sshd: root@pts/1,pts/2  
    root      15188  0.0  0.0 112712   976 pts/1    S+   20:00   0:00 grep --color=auto sshd  

        这是由于管道实现的是进程之间的通信,管道右边进程在ps进程启动后也会启动,它们之间的进程存在交集状态。

  2. grep会对行中符合匹配标准的结果尽可能长的匹配,最终结果可能会发现整个字符串是不符合匹配条件的,但这个字符串部分是符合的。

    [20:25:07 root@centos7 tmp]#cat reg.txt   
    12 goo oogle google    
    ggole goo00le googlegoogl  
    root root googlelegoo rot  
    rotroot rootrot  
    
    [20:31:22 root@centos7 tmp]#egrep "rot|root" reg.txt  
    root root googlelegoo rot  
    rotroot rootrot

    grep命令只要明白了它的工作模式,其他的都不复杂。它选项众多,只要记住常用的就行。