Linux处理文本的三驾马车-grep命令及使用例子
Linux处理文本的三驾马车为
• grep
• sed
• awk
Linux处理文本的第一驾马车——grep命令
以下主要记录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参数搜索- -c:统计匹配成功的行的数量
less Data/example.gtf | grep -w -c 'gene'
##-c,搜索出含有gene的一共多少行,20行
统计单独关键词出现的行数(因为有-w参数)
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
- -e:指定多个匹配模式 :搜索多个关键词
less Data/example.gtf | grep -w -e 'gene' -e UTR
##因为gene有很多种形式,加-w是想搜索单独存在的gene
##同时搜索'gene'和UTR,如果还要同时搜索其它的,还可以继续可以加-e
搜索到的关键词被高亮出来
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
-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参数的示例
- -o:匹配列出关键字符
cat readme.txt | grep 'a'
##不加-o参数
cat readme.txt | grep -o 'a'
##-o的区别
cat readme.txt | grep -o 'a' | wc
-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
只显示匹配上的行
- $ 行尾
cat readme.txt | grep ')$'
##搜索行尾有”)“会被搜索出来
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
- ? 匹配之前项0次或者一次
cat readme.txt | grep 'f\?ee'
##\表示的是转义
##grep命令不识别?,需要在前面加上\来转义
image-20220308121929415
- +匹配1次或者多次
cat readme.txt | grep 're\+'
##也要\转义,re,ree或是reee都可以匹配到。
image-20220308122643476
- *匹配0次或者多次
cat readme.txt | grep 'f*ee'
##*不需要加转义\,因为*可以直接被grep识别到,会搜索到ee,fee,ffee
image-20220308122824777
- . + ?:等都是有一个泛指的含义
- ?和+:需要\来转义,因为grep不能直接识别
- -E:可以识别正则表达式,加-E,?+ 等可以不用转义符。
以下正则表达式的确切匹配
- {n} 匹配n次
cat readme.txt | grep 'fe\{2\}l'
##花括号需要用转义\,e这个字符被搜索两次才会被搜素出来
注意:花括号{}需要转义符\才能被grep识别
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- [^] 排除字符
cat readme.txt | grep '[^Tt]'
##就是不想要的都高亮出来,是T或t的都不要高亮
image-20220308155617818
- | 或
##用的时候要用引号括起来
cat readme.txt | grep 'ee|ea'
##没有显示结果,因为加转义\
cat readme.txt | grep 'ee\|ea'
##有ee或是ea这两个关键词的行都会被匹配出来
###建议搜索的关键词用引号括起来: ‘关键词’
注意:使用|(或)需要用转义符
image-20220308155931507补充知识:
$符号的使用,命令行提示符,普通用户
管理员的命令行提示符是#。管理员或是root的命令行
正则表达式还有很多用法,到在网上自行搜索
正则表达式在线测试:
https://tool.oschina.net/regex/
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后面再加一个less -S,排列就很规整:
image-202203081617255953. 匹配 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行
说明
以上内容参考生信技能树小郭老师的讲解和课件,花了一定的时间,认真做的笔记。