美文网首页文本处理(grep, sed和awk等)pytestLinux学习
Linux处理文本的三驾马车-grep命令及使用例子

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

作者: Ashu | 来源:发表于2022-03-08 16:52 被阅读0次

    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-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行
    

    说明

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

    相关文章

      网友评论

        本文标题:Linux处理文本的三驾马车-grep命令及使用例子

        本文链接:https://www.haomeiwen.com/subject/rbbarrtx.html