欲用神器,必練內(nèi)功

在武俠小說(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è)類Unix系統(tǒng),也繼承這個(gè)思想。管道|就是負(fù)責(zé)一種整合多個(gè)單任務(wù)的小程序來(lái)完成復(fù)雜的任務(wù).

為什么要使用管道呢?首先,管道使得數(shù)據(jù)可以不用寫到磁盤中,直接在內(nèi)存中處理。磁盤讀寫的速度遠(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 auxtop了解當(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é)。
快速入門:https://regexone.com/
你可以在regex101.comwww.debuggex.com校驗(yàn)?zāi)銓懙恼齽t匹配情況。
推薦閱讀:《精通正則表達(dá)式》

總結(jié)

本文簡(jiǎn)單的介紹了linux中幾個(gè)比較重要的概念,限于篇幅和個(gè)人能力,沒(méi)有具體展開(kāi)說(shuō)明,這里作為拋磚引玉用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,534評(píng)論 19 139
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語(yǔ)言,發(fā)作 oo-boon-too 的音。了解發(fā)音是有意...
    螢火蟲(chóng)de夢(mèng)閱讀 100,606評(píng)論 9 468
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯(cuò)誤還是無(wú)法避免 以后資料會(huì)慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,203評(píng)論 2 33
  • 永遠(yuǎn)不要試圖接近 若你終歸遠(yuǎn)離 Part One 回歸&故人 他靜靜地站在樹(shù)蔭下,耳邊盡是此起彼伏的蟬鳴。 修長(zhǎng)挺...
    刈野閱讀 367評(píng)論 0 0
  • 說(shuō)實(shí)在的,近段時(shí)間很迷茫。一直處于奔波忙碌而又混沌空洞的狀態(tài)。 幾乎十年一層不變風(fēng)平浪靜的生活,被自己的一念之差攪...
    靜享春暖花開(kāi)閱讀 653評(píng)論 0 0

友情鏈接更多精彩內(nèi)容