grep可以用来过滤文本中关键词的所在行,在做一些简单字符串筛选的工作中是十分方便的。当然grep的缺点也很明显,就是无法对文件进行分列过滤,即无法实现对某一行某一列进行精准匹配。
例如统计一个x.fasta文件中的基因个数
1
| grep '>' cotton.cds | wc -l
|
常用选项
- –color 对匹配内容高亮显示,可以使用alias进行别名编辑;如alias cg = ‘grep –color’
- -n 显示匹配后的行号
- -c 计算匹配的总行数
- -A num 显示匹配行后面的行
- -B num 显示匹配行前面的行
- -C num 显示匹配行前后的行
- -r -d -R 作用相等,对目录进行递归匹配,与-h参数连用,不显示匹配到的目录名称
- -i 匹配忽略大小写
- -E 拓展匹配,作用等同于egrep
- -v 匹配后取反
- -P 按照perl的匹配方式例如‘\d\w’ 这个对于用过perl正则的人比较方便
实战举例
1 2 3
| [pele@*** ~]$ grep --color 'root' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin
|
1 2 3
| [pele@**** ~]$ grep --color -n 'root' /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 11:operator:x:11:0:operator:/root:/sbin/nologin
|
1 2 3 4 5
| [pele@**** ~]$ grep -c 'root' /etc/passwd 2
[pele@***** ~]$ grep 'root' /etc/passwd | wc -l 2
|
1 2
| grep -v 'root' /etc/passwd
|
1 2 3 4 5 6 7 8 9
| [pele@***** ~]$ grep -A 2 'root' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin -- operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
|
1
| grep -P '\d' /etc/passwd
|
简单的正则匹配
有关正则匹配的内容可以从网上搜索到一大堆,这里只是介绍一些简单的小知识
1
| grep '[0-9]' /etc/passwd
|
1 2
| grep '[a-z]' /etc/passwd
|
1 2
| grep '[A-Z]' /etc/passwd
|
1 2 3 4
| [pele@**** ~]$ grep 'r..t' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
|
- *匹配前一个字符0次或者0次以上
- +匹配前一个字符1次或者1次以上
- ?匹配前一个字符0次或者1次
- |逻辑或匹配
1 2 3 4
| [lilibei@cricaas ~]$ grep -E 'root|liuqibao' /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin liuqibao:x:534:526::/home/liuqibao:/bin/bash
|
1 2 3 4 5 6 7 8 9 10
| [lilibei@cricaas ~]$ cat 1.txt aaa bbb ccc a aa [lilibei@cricaas ~]$ grep -E 'a{2,}' 1.txt aaa aa
|
注意
grep中使用?必须在前面添加,即?一起使用;或者使用grep -E ‘?’;再或者egrep ‘?’
|、{}、+的使用同理