grep可以用来过滤文本中关键词的所在行,在做一些简单字符串筛选的工作中是十分方便的。当然grep的缺点也很明显,就是无法对文件进行分列过滤,即无法实现对某一行某一列进行精准匹配。

例如统计一个*.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正则的人比较方便

实战举例

  • –color
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
  • -n
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
  • -c
1
2
3
4
5
[pele@**** ~]$ grep -c 'root'  /etc/passwd 
2
##等同于
[pele@***** ~]$ grep 'root' /etc/passwd | wc -l
2
  • -V
1
2
grep -v 'root'  /etc/passwd
#这个结果太多,没有列出来
  • -A 2
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
#B和C自己去尝试
  • -r
1
2
#匹配/etc目录下所有包含'root'的文件,结果太大,自己测试!
grep -r 'root' /etc/
  • -P按照perl中的规则进行匹配,书写更为简洁
1
grep -P  '\d' /etc/passwd

简单的正则匹配

有关正则匹配的内容可以从网上搜索到一大堆,这里只是介绍一些简单的小知识

  • [0-9]匹配带有数字的行
1
grep '[0-9]' /etc/passwd
  • [a-z]匹配小写字母
1
grep '[a-z]' /etc/passwd
  • [a-z]匹配大写字母
1
grep '[A-Z]' /etc/passwd
  • ^$匹配空行
1
grep '^$' /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
#匹配含有a的行超过两次
[lilibei@cricaas ~]$ cat 1.txt
aaa
bbb
ccc
a
aa
[lilibei@cricaas ~]$ grep -E 'a{2,}' 1.txt
aaa
aa

注意

grep中使用?必须在前面添加\,即\?一起使用;或者使用grep -E ‘?’;再或者egrep ‘?’
|、{}、+的使用同理