Linux学习笔记(四)
grep
grep
全称是global search regular expression(RE) and print out the line,中文名即全面搜索正则表达式并把行打印出来。是一种强大的文本搜索工具,可以使用正则表达式搜索文本,并将匹配的行列打印出来。Unix的grep
家族包括grep
,egrep
,fgrep
以及zgrep
等,egrep
,fgrep
与grep
的差别很小,egrep
支持更多的re元字符, fgrep
就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示其自身的字面意义,不再特殊grep
可以通过-G、-E、-_F_命令行选项来使用egrep
,fgrep
的功能,zgrep
可以用来处理ZIP格式文件。
grep
常用用法
grep
常用用法如下:
grep [-acinv] [--color=auto] '字符串或者正则表达式' filename
选项参数:
- -a:将binary文件以text文件的方式搜索,即不要忽略二进制数据
- -A<显示列数>:除了显示匹配到的那一行之外,还显示该行之后的内容
- -b:除了显示匹配到的那一行之外,还显示该行之前的内容
- -c:计算匹配到字符串的次数
- -C<显示列数>:除了显示匹配到的那一列之外,还显示该列之前后的内容
- -d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作
- -e<范本样式> 指定字符串作为查找文件内容的范本样式
- -E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式
- -f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式
- -F 将范本样式视为固定字符串的列表
- -G 将范本样式视为普通的表示法来使用
- -h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称
- -H 在显示符合范本样式的那一列之前,标示该列的文件名称
- -l 列出文件内容符合指定的范本样式的文件名称。
- -L 列出文件内容不符合指定的范本样式的文件名称。
- -q 不显示任何信息。
- -R/-r 此参数的效果和指定“-d recurse”参数相同。
- -s 不显示错误信息。
- -w 只显示全字符合的列。
- -x 只显示全列符合的列。
- -y 此参数效果跟“-i”相同。
- -o 只输出文件中匹配到的部分。
- -i:忽略大小写
- -n:输出行号
- -v:方向选择即显示出未匹配到字符串的那一行
- –color=auto:匹配到的字符串颜色高亮
下面我们实战演练一下,我们要从GTF文件中搜索到匹配Olfr418-ps1
的行:
$ grep 'Olfr418-ps1' Mus_musculus.GRCm38.75_chr1_genes.txt
ENSMUSG00000049605 Olfr418-ps1
#打印出行号
$ grep -n 'Olfr' Mus_musculus.GRCm38.75_chr1_genes.txt|head -n 5
548:ENSMUSG00000067064 Olfr1416
549:ENSMUSG00000057464 Olfr1415
550:ENSMUSG00000042849 Olfr1414
551:ENSMUSG00000058904 Olfr1413
552:ENSMUSG00000046300 Olfr1412
通过参数-v
设置可以不匹配不需要的字符串或者正则表达式:
$ grep Olfr Mus_musculus.GRCm38.75_chr1_genes.txt|grep -v Olfr1413|head -n 5
ENSMUSG00000067064 Olfr1416
ENSMUSG00000057464 Olfr1415
ENSMUSG00000042849 Olfr1414
ENSMUSG00000046300 Olfr1412
ENSMUSG00000062497 Olfr1411
需要注意的是,这里我们排除掉
Olfr1413
,但是如果数据集里存在类似于Olfr1413a
这样的字符,grep
也会将之剔除,因此我们需要设置参数-w
进行精准匹配。下面举个例子说明:
$ cat example.txt
bio
bioinfo
bioinformatics
computational biology
# grep without -w
$ grep -v bioinfo example.txt
bio
computational biology
#可以看出这里将含有bioinfo字符串的bioinformatics也剔除掉了,使用参数-w可以避免
$ grep -v -w bioinfo example.txt
bio
bioinformatics
computational biology
我们平常接触的组学数据格式都是很复杂的,当我们匹配的时候我们希望能过浏览匹配到的字符串的前后文,Linux
提供了参数设置:-B(前)、-A(后)以及-C(前后),每个参数后面都跟着一个数字,表示要显示几行,如果匹配到多行,则个匹配之间会用–分割开:
$ grep -B2 'AGATCGG' contam.fastq|head -n 6
@DJB775P1:248:D0MDGACXX:7:1202:12362:49613
TGCTTACTCTGCGTTGATACCACTGCTTAGATCGGAAGAGCACACGTCTGAA
--
JJJJJIIJJJJJJHIHHHGHFFFFFFCEEEEEDBD?DDDDDDBDDDABDDCA
@DJB775P1:248:D0MDGACXX:7:1202:12782:49716
CTCTGCGTTGATACCACTGCTTACTCTGCGTTGATACCACTGCTTAGATCGG
grep
如果结合正则表达式则会显得十分强大,比如如果我们要匹配Olfr1413
以及Olfr1411
,可以使用简单的正则表达式完成:
$ grep 'Olfr141[13]' Mus_musculus.GRCm38.75_chr1_genes.txt
ENSMUSG00000058904 Olfr1413
ENSMUSG00000062497 Olfr1411
当然如果我们要匹配的不具有相同的前缀,那就很尴尬了,这时我们可以利用**POSIX Extended Regular Expressions(ERE)**进行匹配,可以添加参数-E或者直接使用
egrep
都行
$ grep -E "(Olfr1413|Olfr12)" Mus_musculus.GRCm38.75_chr1_genes.txt
ENSMUSG00000058904 Olfr1413
ENSMUSG00000061616 Olfr12
很多时候我们只需要将匹配到的行打印出来,此时我们可以使用参数-o:
$ grep -o "Olfr.*" Mus_musculus.GRCm38.75_chr1_genes.txt|head -n 3
Olfr1416
Olfr1415
Olfr1414