在武俠小說(shuō)里,往往有這樣一個(gè)場(chǎng)景:反面角色從主角手里搶到了某某神器榴嗅,然后當(dāng)著主角的面使用它妄呕,結(jié)果因?yàn)閮?nèi)功不夠深厚,無(wú)法駕馭嗽测,被神器反噬绪励,然后主角一般都有露出一種“早就和你說(shuō)了,你不行”的神情唠粥。
Linux里面也有許多比較好用的工具疏魏,但是如果你的內(nèi)力不夠深厚,沒(méi)有一些必要的基本概念的話晤愧,那么這些工具可能非但無(wú)法讓你提高效率大莫,甚至你的結(jié)果會(huì)更加不可信。本文作為下一篇的鋪墊官份,先介紹一些比較基礎(chǔ)的概念葵硕。
注:本文用到的數(shù)據(jù)為擬南芥的注釋的gff文件眉抬。
本文主要介紹了如下內(nèi)容,可以選擇性的閱讀懈凹。
- 流
- 重定向
- 管道
- 進(jìn)程管理
- 退出狀態(tài)
- 命令替換
流<small>stream</small>
想象一下你面前有一大碗飯蜀变,你無(wú)法一口咽下去,只能一口一口送進(jìn)去介评,然后讓慢慢消化库北。目前生物大數(shù)據(jù)就是那么一大碗飯,機(jī)器的運(yùn)行內(nèi)存就是你的消化器官们陆。對(duì)于動(dòng)不動(dòng)好幾十G的測(cè)序數(shù)據(jù)而言寒瓦,最好的處理的方式,就是以數(shù)據(jù)流的形式一部分一部分的處理坪仇。
大部分的Linux命令都是以流的形式處理數(shù)據(jù)杂腰,例如cat(concatenate files and print on the standard output),就是一行行的讀取文件的數(shù)據(jù),輸出到屏幕上椅文。
# 內(nèi)容很多喂很,需要一段時(shí)間輸出
cat TAIR10_GFF3_genes.gff
重定向<small>redirection</small>
當(dāng)然實(shí)際操作上,我們大部分的輸出不是到屏幕上皆刺,而是到了另一個(gè)文件中少辣。比如說(shuō)把兩個(gè)文件拼接成一個(gè)文件,或者是提取文件的一部分內(nèi)容羡蛾,這個(gè)時(shí)候就需要用到重定向漓帅。
直接cat
,數(shù)據(jù)從標(biāo)準(zhǔn)輸入(文件)流出到屏幕上
重定向的符號(hào)為>
或>>
痴怨,前一個(gè)表示覆蓋忙干,后一個(gè)表示追加:
head -n 10 TAIR10_GFF3_genes.gff > first_ten.gff
tail -n 10 TAIR10_GFF3_genes.gff > last_ten.gff
cat first_ten.gff > new.gff
cat last_ten.gff >> new.gff
上圖還提到一個(gè)標(biāo)準(zhǔn)錯(cuò)誤輸出,我們使用2>
和2>>
進(jìn)行重定向浪藻。
例如捐迫,我用ls
查看一個(gè)不存在的文件
$ ls a.file
ls: cannot access a.file: No such file or directory
如果我不想看到這天信息怎么辦,可以直接丟進(jìn)Linux的“黑洞”設(shè)備(/dev/null)中
ls a.file 2> /dev/null
假設(shè)你想把first_ten.gff和另一個(gè)文件一起合成一個(gè)新文件珠移,然后記錄那些文件出錯(cuò)弓乙,方面之后檢查
$cat first_ten.gff wrong.gff > test.gff 2> log.file
$cat log.file
cat: wrong.gff: No such file or directory
其實(shí)除了輸出可以重定向,輸入也可以重定向<
钧惧,只不過(guò)一般而言我們都是使用文件或者用管道直接提供數(shù)據(jù)暇韧,所以知道存在這個(gè)東西就行了。
cat < test.gff > new_test.gff
管道:優(yōu)美且強(qiáng)大
Unix的一個(gè)設(shè)計(jì)哲學(xué)就是整合小程序完成大任務(wù)浓瞪。Linux作為一個(gè)類(lèi)Unix系統(tǒng)懈玻,也繼承這個(gè)思想。管道|
就是負(fù)責(zé)一種整合多個(gè)單任務(wù)的小程序來(lái)完成復(fù)雜的任務(wù).
為什么要使用管道呢乾颁?首先涂乌,管道使得數(shù)據(jù)可以不用寫(xiě)到磁盤(pán)中艺栈,直接在內(nèi)存中處理。磁盤(pán)讀寫(xiě)的速度遠(yuǎn)遠(yuǎn)低于內(nèi)存湾盒,所以使用管道可以極大地提高計(jì)算效率湿右。其次,管道能夠讓許多小程序像樂(lè)高積木一樣結(jié)合起來(lái)罚勾,完成一些單個(gè)程序無(wú)法完成任務(wù)毅人,例如統(tǒng)計(jì)擬南芥注釋信息中各個(gè)feature的數(shù)量.
$ cat TAIR10_GFF3_genes.gff | cut -f '3' | grep -v 'chromosome' | sort | uniq -c | sort -k1,1nr
215909 exon
197160 CDS
35386 mRNA
35386 protein
34621 five_prime_UTR
30634 three_prime_UTR
28775 gene
3911 mRNA_TE_gene
3903 transposable_element_gene
1274 pseudogenic_exon
926 pseudogenic_transcript
924 pseudogene
689 tRNA
480 ncRNA
180 miRNA
71 snoRNA
15 rRNA
13 snRNA
這里不過(guò)多解釋這些具體命令的用法,畢竟已經(jīng)有很多文章介紹過(guò)了尖殃。
進(jìn)程管理
每當(dāng)你敲下一個(gè)命令丈莺,它就會(huì)以一個(gè)進(jìn)程的形式運(yùn)行。實(shí)際上送丰,Linux后臺(tái)每時(shí)每刻都運(yùn)行著大量的程序缔俄,你可以使用ps aux
或top
了解當(dāng)前正在運(yùn)行的程序。
當(dāng)一個(gè)程序運(yùn)行比較快的時(shí)候器躏,比如說(shuō)ls
,cd
等俐载,幾乎不會(huì)對(duì)你當(dāng)前的終端有任何影響,但是一旦你運(yùn)行一個(gè)比較耗時(shí)的命令邀桑,例如你要進(jìn)行序列比對(duì)瞎疼,那么當(dāng)前的終端就會(huì)被這個(gè)程序占用科乎。如果不小心按錯(cuò)了壁畸,讓程序停止,那么估計(jì)你的內(nèi)心是崩潰(別問(wèn)我為什么會(huì)知道)茅茂。
所以最好的方法就是讓一些耗時(shí)的程序運(yùn)行在后臺(tái)捏萍,方法很簡(jiǎn)單就是在命令后面加上&
。例如我上面的就比較耗時(shí)空闲,我就能放在后臺(tái)運(yùn)行令杈。
cat TAIR10_GFF3_genes.gff | cut -f '3' | grep -v 'chromosome' | sort | uniq -c | sort -k1,1nr &
[1] 48450
它會(huì)提供一個(gè)進(jìn)程號(hào),用于之后的操作碴倾。你可以用fg
查看正在后臺(tái)運(yùn)行的命令逗噩。
如果你這個(gè)時(shí)候不想讓程序運(yùn)行,你可以使用fg %cat
將它放到前臺(tái)跌榔,然后使用ctrl+c
結(jié)束命令异雁。
或者你突然忘記在一個(gè)命令后加&
,而你又發(fā)現(xiàn)這個(gè)命令耗時(shí)比較久僧须,你可以先用ctrl+z
讓它暫停到后臺(tái)纲刀,然后用bg
使它在后臺(tái)運(yùn)行
bg %cat
[1]+ cat TAIR10_GFF3_genes.gff | cut -f '3' | grep --color=auto -v 'chromosome' | sort | uniq -c | sort -k1,1nr &
退出狀態(tài)
計(jì)算機(jī)如何知道你的程序能否工作呢?它們依賴于一種退出狀態(tài)(exit status)的機(jī)制担平,表示為$?
示绊。
$ echo "$?"
0
所謂正確的結(jié)果只有一種(顯示為0)锭部,而錯(cuò)誤的原因卻各種各樣(1-255)。
退出狀態(tài)有什么用面褐?主要是在一系列前后關(guān)聯(lián)的程序中拌禾,比如說(shuō)command2運(yùn)行依賴與command1的成功(&&),而command3卻只有在command1失敗了(||)才能運(yùn)行展哭。
true && echo "true"
false || echo "false"
命令替換
所謂的命令替換$()
就是在另一個(gè)命令內(nèi)部中運(yùn)行并且返回字符串蹋砚。例如你根據(jù)日期來(lái)創(chuàng)建文件夾,通常的做法是:看看今天幾號(hào)摄杂,然后mkdir xxx
坝咐,但是使用命令替換后就特別的方便了
mkdir $(date +%F)
$ ls
2017-03-24
正則表達(dá)式
正則表達(dá)式(Regular Expression,RE,regex)是一個(gè)強(qiáng)大字符串操作引擎,可用于檢索析恢、替換那些符合某個(gè)模式(規(guī)則)的文本的墨坚。
由于我對(duì)正則表達(dá)式的理解也不夠深刻,所以這里就不特別展開(kāi)映挂,提供如下資料用于自學(xué)泽篮。
快速入門(mén):https://regexone.com/
你可以在regex101.com和www.debuggex.com校驗(yàn)?zāi)銓?xiě)的正則匹配情況。
推薦閱讀:《精通正則表達(dá)式》
總結(jié)
本文簡(jiǎn)單的介紹了linux中幾個(gè)比較重要的概念柑船,限于篇幅和個(gè)人能力帽撑,沒(méi)有具體展開(kāi)說(shuō)明,這里作為拋磚引玉用鞍时。