ashu

V1

2022/04/10阅读:12主题:默认主题

Linux处理文本的三驾马车-grep命令实用例子

Linux处理文本的三驾马车-grep命令实用例子

Linux处理文本的三驾马车

grep

sed

awk

以下主要记录grep的用法,后续会把另外两架马车(sed和awk命令)的用法整理出来。

grep

grep是一个最初用于Unix操作系统的命令行工具。在给出文件列表或标准输入后,grep会对匹配一个或多个正则表达式的文本进行搜索,并只输出匹配(或者不匹配)的行或文本。https://zh.wikipedia.org/wiki/Grep

使用格式

grep [options] pattern file

pattern是关键词

常见参数

-w:word 精确查找某个关键词 pattern

-c:统计匹配成功的行的数量

-v:反向选择,即输出没有没有匹配的行

-n:显示匹配成功的行所在的行号

-r:从目录中查找pattern

-e:指定多个匹配模式

-f:从指定文件中读取要匹配的 pattern

-i:忽略大小写

结合参数的用法:

这里用了生信技能树提供的一个文件example.gtf,也可以到这个网址http://hgdownload.cse.ucsc.edu/downloads.html挑一个物种gtf格式的文件,或是使用一个txt格式的文本(像生信技能树提供简单readme.txt)练习。

  • -w:word 精确查找某个关键词 pattern (完整单词
less Data/example.gtf | grep 'gene'
##搜索出的gene就会被高亮出来,但是显示出的有‘gene’,‘gene_status’,‘gene_id’
less Data/example.gtf | grep -w 'gene'
##加-w就是搜索出独立的‘gene’,其它带有连字符_的gene没有被高亮,如‘gene_status’,‘gene_id’。

不加参数搜索,带有关键词的所有基因格式都被搜索(高亮)出来

不加参数搜索,带有关键词的所有基因格式会被搜索出来
不加参数搜索,带有关键词的所有基因格式会被搜索出来

加**-w**就是搜索出独立的‘gene’,其它带有连字符_的gene没有被高亮(搜索出来)

加-w参数搜索
加-w参数搜索
  • -c:统计匹配成功的行的数量
less Data/example.gtf | grep -w -c 'gene'
##-c,搜索出含有gene的一共多少行,20行

统计单独关键词出现的行数(因为有-w参数)

image-20220308102004519
image-20220308102004519
  • -v:反向选择,即输出没有没有匹配的行(匹配到关键词的不要,没有关键词的被保留下来)
less Data/example.gtf | grep -w -v 'gene'
##-v,展示所有不含独立gene存在,如外显子,
less Data/example.gtf | grep -w -v -c 'gene'
##可以加上-c,也能统计出没有含gene的行数,217行
wc -l Data/example.gtf
##统计原文件有237行,含有gene的有20行,不含gene有217行,加起来一共237行。
反向搜索
反向搜索
  • -n:显示匹配成功的行所在的行号
less Data/example.gtf | grep -w -n 'gene'
##显示关键词所在的行号
显示关键词所在的行号
显示关键词所在的行号
  • -r:从目录中查找pattern
grep 'hello' -r ./ ##-r指定根目录
grep 'hello' -r ./ ##指定目录,忽略大小写
##之前在当前目录下成功安装过miniconda,conda里面文件,文件有很hello,都刷屏了。
grep 'Welcome' -r Data/
##把关键词所在的目录显示出来:Data/readme.txt:Welcome to Biotrainee() !
grep -i 'welcome' -r Data/
##有时候记不得哪个词是大写,加-i,忽略大小写,后续会讲
image-20220308104016220
image-20220308104016220
  • -e:指定多个匹配模式 :搜索多个关键词
less Data/example.gtf | grep -w -e 'gene' -e UTR
##因为gene有很多种形式,加-w是想搜索单独存在的gene
##同时搜索'gene'和UTR,如果还要同时搜索其它的,还可以继续可以加-e

搜索到的关键词被高亮出来

image-20220308104626254
image-20220308104626254
  • -f:从指定文件中读取要匹配的 pattern(关键词)
##这里举一个比较特殊的例子
##如果有5个以上的关键词要搜索,命令太长就很麻烦,可以建一个文本,每个关键词独占一行
cat >keywords
gene
UTR
start_codon
stop_codon
^C  ##按control c 退出
cat keywords
less Data/example.gtf | grep -w -f keywords | less -S
##含有关键词的行就被搜索出来,没有的行就不会被输出。
image-20220308105252568
image-20220308105252568
-f关键词匹配
-f关键词匹配
  • -i:忽略大小写
less Data/example.gtf | grep utr
##example.gtf没有小写的utr,不加-i,没法匹配出来
less Data/example.gtf | grep -i utr
##-i忽略大小写
less Data/example.gtf | grep -i Utr
##Utr,关键词含有一个大写字母
-i参数的示例
-i参数的示例
  • -o:匹配列出关键字符
cat readme.txt | grep 'a'
##不加-o参数
cat readme.txt | grep -o 'a'
##-o的区别
cat readme.txt | grep -o 'a' | wc
-o参数的示例
-o参数的示例

正则表达式

是对字符串操作的一种逻辑公式,就是用事先 定义好的一些特定字符、及这些特定字符的组合,组成一个 “规则字符串”,这个“规则字符串”用来表达对字符串的 一种过滤逻辑(可以理解为模糊搜索或是模糊匹配—逻辑的模糊)

^ 行首定位的功能

$ 行尾定位的功能

. 换行符之外的任意单个字符

? 匹配之前项 0 次或者一次

+ 匹配 1 次或者多次

***** 匹配 0 次或者多次

{n} 匹配 n

{n,} 匹配至少 n

{m,n} 至少 m, **最多 ** n

[] 匹配任意一个

[^] 排除字符

| 或者

-E可以识别正则表达式,?+ 等可以不用转义符。

正则表达式的示例

以readme.txt文本作为示例:

cat readme.txt
# Welcome to Biotrainee()!
#   This is your personal account in our Cloud.
# Have a fun with it.
# Please feel free to contact with me(email to jmzeng1314@163.com)
# (http://www.biotrainee.com/thread-1376-1-1.html)
  • ^ 行首
 cat readme.txt | grep '^T'
 ##行首有大写字母T会被高亮,以及所在的行会被搜索出来
image-20220308121003893
image-20220308121003893

只显示匹配上的行

  • $ 行尾
cat readme.txt | grep ')$'
##搜索行尾有”)“会被搜索出来
image-20220308121044074
image-20220308121044074
  • . 换行符之外的任意单个字符
cat readme.txt | grep 'f.ee'
##'f.ee'中的.匹配字母r,空格也可以。
cat readme.txt | grep 't w'
##举个对比的,用空格
cat readme.txt | grep 't.w'
##用.
cat readme.txt | grep '.ee'
##这个例子更明显
image-20220308121747934
image-20220308121747934
  • ? 匹配之前项0次或者一次
cat readme.txt | grep 'f\?ee'
##\表示的是转义
##grep命令不识别?,需要在前面加上\来转义
image-20220308121929415
image-20220308121929415
  • +匹配1次或者多次
cat readme.txt | grep 're\+'
##也要\转义,re,ree或是reee都可以匹配到。
image-20220308122643476
image-20220308122643476
  • *匹配0次或者多次
cat readme.txt | grep 'f*ee'
##*不需要加转义\,因为*可以直接被grep识别到,会搜索到ee,fee,ffee
image-20220308122824777
image-20220308122824777
  • . + ?:等都是有一个泛指的含义
  • ?和+:需要\来转义,因为grep不能直接识别
  • -E:可以识别正则表达式,加-E,?+ 等可以不用转义符。

以下正则表达式的确切匹配

  • {n} 匹配n次
cat readme.txt | grep 'fe\{2\}l'
##花括号需要用转义\,e这个字符被搜索两次才会被搜素出来

注意:花括号{}需要转义符\才能被grep识别

image-20220308155138765
image-20220308155138765
  • {n,} 匹配至少n次
cat readme.txt | grep 'fe\{2,10\}l'
###{m,n} 至少m,最多n 
  • [] 匹配任意一个
cat readme.txt | grep [bB]
##b和B为关键词,单独一个字符就是一个关键词

只要有b或是B都会被匹配出来

image-20220308155459634
image-20220308155459634
  • [^] 排除字符
cat readme.txt | grep '[^Tt]'
##就是不想要的都高亮出来,是T或t的都不要高亮
image-20220308155617818
image-20220308155617818
  • | 或
##用的时候要用引号括起来
cat readme.txt | grep 'ee|ea'
##没有显示结果,因为加转义\
cat readme.txt | grep 'ee\|ea'
##有ee或是ea这两个关键词的行都会被匹配出来
###建议搜索的关键词用引号括起来: ‘关键词’

注意:使用|(或)需要用转义符

image-20220308155931507
image-20220308155931507

补充知识:

  • $符号的使用,命令行提示符,普通用户

  • 管理员的命令行提示符是#。管理员或是root的命令行

正则表达式还有很多用法,到在网上自行搜索

正则表达式在线测试:

https://tool.oschina.net/regex/

image-20220228162111929
image-20220228162111929

正则表达式教程

https://www.runoob.com/regexp/regexp-syntax.html

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions

其实用的不多,生信分析做的是一些比较低级别文本处理,就用比较简单的语法

作业

1. 精确匹配 example.gtf 中的 gene ,并统计

less -S Data/example.gtf | grep -w  'gene' -c 
#20
less -S Data/example.gtf | grep -w 'gene' |wc 

2. 匹配 exon 的行,然后反向输出

less -S Data/example.gtf | grep -w -v 'exon' | less -S
##后面再加less -S是为了排列更整齐

可以对比看看:

image-20220308161324066
image-20220308161324066

后面再加一个less -S,排列就很规整:

image-20220308161725595
image-20220308161725595

3. 匹配 CDS 或者 UTR 的行

less -S Data/example.gtf | grep -w 'CDS\|UTR'
less -S Data/example.gtf | grep -w -e 'CDS' -e 'UTR'

#正则表达式:转义符和—E行使同样的功能:
less -S Data/example.gtf | grep -w 'CDS\|UTR'
less -S Data/example.gtf | grep -E -w 'CDS|UTR'
#-E和\任选一项

4. 查找 example.fq 文件 包含 @ 的行并统计

#答案操作流程:
less -S Data/example.fq##首先
less -S Data/example.fq | grep '@'| wc
#  10      10      20##20主要是没和后面有一个换行符,累计起来20个

5. 查找 example.fq 文件 @ 开头 的行并统计

#答案流程:
less -S Data/example.fq | grep '@'
less -S Data/example.fq | grep '^@' |less
less -S Data/example.fq | grep '^@' |wc
#1006    2006   54308
less -S Data/example.fq |grep '^@' |grep -v '@ERR'
##发现有6行是原文件的质量值。
#其实有1000行

说明

以上内容参考生信技能树小郭老师的讲解和课件,花了一定的时间,认真做的笔记。

分类:

后端

标签:

后端

作者介绍

ashu
V1