Linux處理文本的三駕馬車為
? grep
? sed
? awk
Linux處理文本的第一駕馬車——grep命令
以下主要記錄grep的用法卿闹,后續(xù)會把另外兩架馬車(sed和awk命令)的用法整理出來。
grep
grep是一個最初用于Unix操作系統(tǒng)的命令行工具。在給出文件列表或標準輸入后,grep會對匹配一個或多個正則表達式的文本進行搜索,并只輸出匹配(或者不匹配)的行或文本祭刚。https://zh.wikipedia.org/wiki/Grep
使用格式
grep [options] pattern file
pattern是關(guān)鍵詞
常見參數(shù)
-w:word 精確查找某個關(guān)鍵詞 pattern
-c:統(tǒng)計匹配成功的行的數(shù)量
-v:反向選擇,即輸出沒有沒有匹配的行
-n:顯示匹配成功的行所在的行號
-r:從目錄中查找pattern
-e:指定多個匹配模式
-f:從指定文件中讀取要匹配的 pattern
-i:忽略大小寫
結(jié)合參數(shù)的用法:
這里用了生信技能樹提供的一個文件example.gtf,也可以到這個網(wǎng)址http://hgdownload.cse.ucsc.edu/downloads.html挑一個物種gtf格式的文件涡驮,或是使用一個txt格式的文本(像生信技能樹提供簡單readme.txt)練習(xí)暗甥。
- -w:word 精確查找某個關(guān)鍵詞 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’。
不加參數(shù)搜索无牵,帶有關(guān)鍵詞的所有基因格式都被搜索(高亮)出來
加-w就是搜索出獨立的‘gene’,其它帶有連字符_的gene沒有被高亮(搜索出來)
- -c:統(tǒng)計匹配成功的行的數(shù)量
less Data/example.gtf | grep -w -c 'gene'
##-c,搜索出含有g(shù)ene的一共多少行茎毁,20行
統(tǒng)計單獨關(guān)鍵詞出現(xiàn)的行數(shù)(因為有-w參數(shù))
- -v:反向選擇克懊,即輸出沒有沒有匹配的行(匹配到關(guān)鍵詞的不要,沒有關(guān)鍵詞的被保留下來)
less Data/example.gtf | grep -w -v 'gene'
##-v,展示所有不含獨立gene存在七蜘,如外顯子谭溉,
less Data/example.gtf | grep -w -v -c 'gene'
##可以加上-c,也能統(tǒng)計出沒有含gene的行數(shù)崔梗,217行
wc -l Data/example.gtf
##統(tǒng)計原文件有237行夜只,含有g(shù)ene的有20行,不含gene有217行蒜魄,加起來一共237行扔亥。
- -n:顯示匹配成功的行所在的行號
less Data/example.gtf | grep -w -n 'gene'
##顯示關(guān)鍵詞所在的行號
- -r:從目錄中查找pattern
grep 'hello' -r ./ ##-r指定根目錄
grep 'hello' -r ./ ##指定目錄,忽略大小寫
##之前在當(dāng)前目錄下成功安裝過miniconda谈为,conda里面文件旅挤,文件有很hello,都刷屏了伞鲫。
grep 'Welcome' -r Data/
##把關(guān)鍵詞所在的目錄顯示出來:Data/readme.txt:Welcome to Biotrainee() !
grep -i 'welcome' -r Data/
##有時候記不得哪個詞是大寫粘茄,加-i,忽略大小寫秕脓,后續(xù)會講
- -e:指定多個匹配模式 :搜索多個關(guān)鍵詞
less Data/example.gtf | grep -w -e 'gene' -e UTR
##因為gene有很多種形式柒瓣,加-w是想搜索單獨存在的gene
##同時搜索'gene'和UTR,如果還要同時搜索其它的吠架,還可以繼續(xù)可以加-e
搜索到的關(guān)鍵詞被高亮出來
- -f:從指定文件中讀取要匹配的 pattern(關(guān)鍵詞)
##這里舉一個比較特殊的例子
##如果有5個以上的關(guān)鍵詞要搜索芙贫,命令太長就很麻煩,可以建一個文本傍药,每個關(guān)鍵詞獨占一行
cat >keywords
gene
UTR
start_codon
stop_codon
^C ##按control c 退出
cat keywords
less Data/example.gtf | grep -w -f keywords | less -S
##含有關(guān)鍵詞的行就被搜索出來磺平,沒有的行就不會被輸出魂仍。
- -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擦酌,關(guān)鍵詞含有一個大寫字母
- -o:匹配列出關(guān)鍵字符
cat readme.txt | grep 'a'
##不加-o參數(shù)
cat readme.txt | grep -o 'a'
##-o的區(qū)別
cat readme.txt | grep -o 'a' | wc
正則表達式
是對字符串操作的一種邏輯公式,就是用事先 定義好的一些特定字符菠劝、及這些特定字符的組合赊舶,組成一個 “規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的 一種過濾邏輯(可以理解為模糊搜索或是模糊匹配—邏輯的模糊)
^ 行首 :定位的功能
$ 行尾 :定位的功能
. 換行符之外的任意單個字符
? 匹配之前項 0 次或者一次
+ 匹配 1 次或者多次
***** 匹配 0 次或者多次
{n} 匹配 n 次
{n,} 匹配至少 n 次
{m,n} 至少 m, **最多 ** n
[] 匹配任意一個
[^] 排除字符
| 或者
-E可以識別正則表達式闸英,锯岖?+ 等可以不用轉(zhuǎn)義符介袜。
正則表達式的示例
以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會被高亮甫何,以及所在的行會被搜索出來
只顯示匹配上的行
- $ 行尾
cat readme.txt | grep ')$'
##搜索行尾有”)“會被搜索出來
- . 換行符之外的任意單個字符
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'
##這個例子更明顯
- ? 匹配之前項0次或者一次
cat readme.txt | grep 'f\?ee'
##\表示的是轉(zhuǎn)義
##grep命令不識別?辙喂,需要在前面加上\來轉(zhuǎn)義
- +匹配1次或者多次
cat readme.txt | grep 're\+'
##也要\轉(zhuǎn)義,re鸠珠,ree或是reee都可以匹配到巍耗。
- *匹配0次或者多次
cat readme.txt | grep 'f*ee'
##*不需要加轉(zhuǎn)義\,因為*可以直接被grep識別到,會搜索到ee,fee,ffee
- . + ?:等都是有一個泛指的含義
- ?和+:需要\來轉(zhuǎn)義渐排,因為grep不能直接識別
- -E:可以識別正則表達式炬太,加-E,驯耻?+ 等可以不用轉(zhuǎn)義符亲族。
以下正則表達式的確切匹配
- {n} 匹配n次
cat readme.txt | grep 'fe\{2\}l'
##花括號需要用轉(zhuǎn)義\,e這個字符被搜索兩次才會被搜素出來
注意:花括號{}需要轉(zhuǎn)義符\才能被grep識別
- {n,} 匹配至少n次
cat readme.txt | grep 'fe\{2,10\}l'
###{m,n} 至少m,最多n
- [] 匹配任意一個
cat readme.txt | grep [bB]
##b和B為關(guān)鍵詞,單獨一個字符就是一個關(guān)鍵詞
只要有b或是B都會被匹配出來
- [^] 排除字符
cat readme.txt | grep '[^Tt]'
##就是不想要的都高亮出來可缚,是T或t的都不要高亮
- | 或
##用的時候要用引號括起來
cat readme.txt | grep 'ee|ea'
##沒有顯示結(jié)果霎迫,因為加轉(zhuǎn)義\
cat readme.txt | grep 'ee\|ea'
##有ee或是ea這兩個關(guān)鍵詞的行都會被匹配出來
###建議搜索的關(guān)鍵詞用引號括起來: ‘關(guān)鍵詞’
注意:使用|(或)需要用轉(zhuǎn)義符
補充知識:
$符號的使用,命令行提示符帘靡,普通用戶
管理員的命令行提示符是#知给。管理員或是root的命令行
正則表達式還有很多用法,到在網(wǎng)上自行搜索
正則表達式在線測試:
https://tool.oschina.net/regex/
正則表達式教程
https://www.runoob.com/regexp/regexp-syntax.html
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
其實用的不多描姚,生信分析做的是一些比較低級別文本處理涩赢,就用比較簡單的語法
作業(yè)
1. 精確匹配 example.gtf 中的 gene ,并統(tǒng)計
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是為了排列更整齊
可以對比看看:
后面再加一個less -S筒扒,排列就很規(guī)整:
3. 匹配 CDS 或者 UTR 的行
less -S Data/example.gtf | grep -w 'CDS\|UTR'
less -S Data/example.gtf | grep -w -e 'CDS' -e 'UTR'
#正則表達式:轉(zhuǎn)義符和—E行使同樣的功能:
less -S Data/example.gtf | grep -w 'CDS\|UTR'
less -S Data/example.gtf | grep -E -w 'CDS|UTR'
#-E和\任選一項
4. 查找 example.fq 文件 包含 @ 的行并統(tǒng)計
#答案操作流程:
less -S Data/example.fq##首先
less -S Data/example.fq | grep '@'| wc
# 10 10 20##20主要是沒和后面有一個換行符,累計起來20個
5. 查找 example.fq 文件 以 @ 開頭 的行并統(tǒng)計
#答案流程:
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'
##發(fā)現(xiàn)有6行是原文件的質(zhì)量值赃阀。
#其實有1000行
說明
以上內(nèi)容參考生信技能樹小郭老師的講解和課件霎肯,花了一定的時間擎颖,認真做的筆記。