过滤文本grep命令

  1. grep是一种强大的文本搜索工具命令,用于查找文件中符合指定格式的字符串,支持正则表达式。如不指定任何文件名称,或是所给予的文件为“-”,则grep命令从标准输入设备读取数据。grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep命令有很小不同。egrep是grep的扩展。fgrep就是fixed grep或fast grep,该命令使用任何正则表达式中的元字符表示其自身的字面意义,不在特殊。其中egrep就等同于“grep -E”,fgrep等同于“grep -F”。Linux中grep功能强大,支持很多丰富的参数,可以方面的进行一些文本处理工作。
  2. grep单独使用时至少有两个参数,如少于两个参数,grep会一直等待,直到该程序被中断。如果遇到了这样的情况,可以按“Ctrl+c”终止。默认的情况下只搜索当前目录,如果递归查找子目录,可使用“r”选项。

    示例

    #在指定文件中查找特定字符串
    [root@localhost ~]# grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    #结合管道一起使用
    [root@localhost ~]# cat /etc/passwd | grep root 
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    #将显示符合条件的内容所在的行号
    [root@localhost ~]# grep -n root /etc/passwd
    1:root:x:0:0:root:/root:/bin/bash
    10:operator:x:11:0:operator:/root:/sbin/nologin
    #反向查询
    [root@localhost ~]# cat file1 
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    max_connections=10000
    [root@localhost ~]# grep var file1 
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    [root@localhost ~]# grep -v var file1 
    [mysqld]
    max_connections=10000
    #递归查找
    [root@localhost ~]# grep -r var . | head -3
    Binary file ./CentOS-7-x86_64-DVD-1511.iso matches
    ./file1:datadir=/var/lib/mysql
    ./file1:socket=/var/lib/mysql/mysql.sock
    #按正则表达式查找
    [root@localhost ~]# grep -E "datadir|socket" /etc/my.cnf      
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    #列出匹配字符串的文件名
    [root@localhost ~]# grep -l var file1        
    file1
    #列出不匹配字符串的文件名
    [root@localhost ~]# grep -L VAR file1 
    file1
    #除了显示匹配的行,分别显示该行上下文的N行
    [root@localhost ~]# grep -C1 var file1 
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    max_connections=10000

    常见grep正规参数

参数 说明
^ 指定匹配字符串的行首
$ 指定匹配字符串的结尾
* 表示0个以上的字符
+ 表示1个以上的字符
| 去掉指定字符的表述含义
. 匹配一个非换行符的字符
匹配零个或多个先前的字符
+ 匹配一个或多个先前的字符