Linux学习笔记(四)

mark

grep

grep全称是global search regular expression(RE) and print out the line,中文名即全面搜索正则表达式并把行打印出来。是一种强大的文本搜索工具,可以使用正则表达式搜索文本,并将匹配的行列打印出来。Unixgrep家族包括grep,egrep,fgrep以及zgrep等,egrep,fgrepgrep的差别很小,egrep支持更多的re元字符, fgrep就是fixed grepfast 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
Researcher

I am a PhD student of Crop Genetics and Breeding at the Zhejiang University Crop Science Lab. My research interests covers a range of issues:Population Genetics Evolution and Ecotype Divergence Analysis of Oilseed Rape, Genome-wide Association Study (GWAS) of Agronomic Traits.

comments powered by Disqus