生信分析人員如何系統入門Linux(2019更新版)

  • 2019 年 10 月 4 日
  • 筆記

前面我更新了針對生信工程師R語言入門指南,見:生信分析人員如何系統入門R(2019更新版) ,廣受好評,反響熱烈,趁熱打鐵我應該把剩餘的3個知識點也認真系統更新一下,恰好昨天授課講解的就是linux學習路線圖!

生信分析人員如何系統入門R(2019更新版) 裡面,我提到過Linux基本上幾十年都沒有怎麼變動過基礎知識的,哪怕你現在搜索到十幾年前的Linux教學影片,也不會覺得尷尬。而且Linux屬於IT工程師必備技能,IT的發展程度遠超於我們,再加上各種馬哥鳥叔,還有黑馬訓練營公開30天完整教學影片,按照道理我是沒有必要在他們IT專業人士面前班門弄虎的, 畢竟他們隨便拿幾個偏門知識點就可以問倒我了!不過我們生信技能樹的特色是主打生物資訊學方向技能建設,而它作為一個典型的教交叉學科,想在此領域成為一個專業靠譜的生信工程師,我們實在是做不到在任何一個非核心知識點投入過多的時間和精力。

寫在前面

可以把Linux的學習過程分成6個階段 ,一般來說,每個階段都需要至少一天以上的學習:

  • 第1階段:把linux系統玩得跟Windows或者MacOS那樣的桌面作業系統一樣順暢,主要目的就是去可視化,熟悉黑白命令行介面,可以僅僅以鍵盤交互模式完成常規文件夾及文件管理工作。
  • 第2階段:做到文本文件的表格化處理,類似於以鍵盤交互模式完成Excel表格的排序、計數、篩選、去冗餘,查找,切割,替換,合併,補齊,熟練掌握awk,sed,grep這文本處理的三駕馬車。
  • 第3階段:元字元,通配符及shell中的各種擴展,從此linux操作不在神秘!
  • 第4階段:高級目錄管理:軟硬鏈接,絕對路徑和相對路徑,環境變數
  • 第5階段:任務提交及批處理,腳本編寫解放你的雙手
  • 第6階段:軟體安裝及conda管理,讓linux系統實用性放飛自我

僅僅是以自己多年處理生物資訊學數據經驗給大家總結一下Linux該如何學,希望這個給初學者的知識點路線圖能幫助到你。

第一階段:常規文件夾及文件管理工作

大家這個時候可以回憶一下自己在Windows或者MacOS這樣的桌面作業系統日常學習辦公主要是做什麼,比如會在C盤D盤存放不同的資料,不同的文件夾分門別類,處理各種文件類型,pdf的文獻,word的手稿,txt的文本等等,整理資料,文件夾挪動,刪除不需要的東西,發送到桌面快捷方式等等,這些都是大家通過滑鼠在視窗作業系統,所見即所得的模式完成。

而在LINUX的命令行,一切都不一樣,傳統意義的滑鼠幾乎失去了功能,只能是靠鍵盤發送具有特定規則的命令來與我們的LINUX電腦進行交互。你首先需要根據IP和用戶名密碼連接遠程伺服器(使用Xshell,finalshell ,SecureCRT,Putty,VNC等具有ssh功能的軟體均可),這一步就會攔住很多人。

如果你是Windows電腦,這個時候可以選擇安裝一個git軟體,默認安裝後就可以右鍵點擊進入bash here環境,可以小範圍的測試一些常規文件夾及文件管理命令,如果你是MAC電腦,那麼自帶的終端(terminal) 也可以練習這些命令。

這個時候我們需要學習的常規文件夾及文件管理基礎命令不多

ls ## list 列出當前路徑下資訊  pwd ## print working directory 列印工作目錄,即當前所在目錄  cd ## change directory 切換目錄  mkdir ## make directory建立一個新的目錄  touch ## 創建文本  mv ## Move 更改文件或目錄,移動目錄或文件  rm ## ReMove 刪除目錄或文件  cp ## copy and paste 將給出的文件或目錄複製到另一個文件或目錄中 tar ## Tape archive 解壓文件  ln ## LINk 鏈接文件  

可以看到,大部分命令都是其英文單詞的縮寫,畢竟電腦大部分基礎建設都是基於英文體系的,雖然命令不多,但是參數組合不少。

比如ls命令,就是lst , 可以列出當前路徑下資訊,就有大量的參數:

## 常見參數  -a :全部的目錄,連同隱藏文件夾一起列出來  -h :將目錄容量轉換為以易讀的方式(例如 GB, KB 等等) -l :列出目錄的詳細資訊  -S :以文件大小排序  -t :以時間排序  -R : 遞歸目錄列出文件  -d : 顯示目錄本身,而非目錄下文件  

你需要結合你自己在Windows或者MacOS這樣的桌面作業系統日常學習辦公實際需求來理解和學習它,你可以查看文件夾下面的文件資訊,也可以查看詳情,也可以按照文件大小,文件修改時間排序,那麼這些功能就通通是可以命令行化!

當然,你也可以不在自己電腦練習,比如選擇使用騰訊雲實驗室的linux伺服器:https://cloud.tencent.com/developer/labs/lab/10000 或者乾脆購買一個最低配版本雲伺服器,應該是十塊錢一個月, 就可以練習上面的命令。

具體的每個命令,這裡就不展開講解了,大家可以對著命令的幫助文檔或者示例演練教程慢慢練習和體會,不得不提的 man 命令可以查看大部分 文件夾及文件管理基礎命令的標準文檔。

第二階段:文本文件處理大全

提到文本文件,在Windows或者MacOS這樣的桌面作業系統裡面,通常是txt後綴和Excel文件,最常見的需求就是打開看了,這裡必須強調一下,在linux命令行環境下面,只有普通的txt文本文件是可以直接查看的,這個時候我們需要熟練使用3個配對操作命令:

head # 功能:顯示文檔的開頭至標準輸出中,默認顯示十行。  tail # 功能:顯示文檔的末尾至標準輸出中,默認顯示十行。  less  # 功能:逐頁查看文檔內容。  more # 也是逐頁查看文檔內容,跟less類似  cat # cat 命令 (concatenate) 查看文本,輸出到螢幕  tac # tac 命令 反向查看,是cat命令的補充  

同樣的,每個命令都是有著不同的參數,來擴展它們的功能,比如cat命令就可以加上

-A:顯示全部內容,包括特殊字元,可列出一些特殊字元而不是空白而已;  -b:列出行號,僅針對非空白行做行號顯示,空白行不標行號!  -E:將結尾的斷行字元$顯示出來;  -n:列印出行號,連同空白行也會有行號,與-b的選項不同:  -T:將[tab]按鍵以I顯示出來;  -v:列出一些看不出來的特殊字元  

也是需要初學者花費時間去一個個體驗學習,其中值得一提的less命令是一個互動式命令,假設你開始學習它了,就需要知道如何退出。

因為在命令行是沒有Excel這樣的軟體的,但是我們文本文件的表格化處理的需求是仍然存在的,所以就需要學習大量的類似於Excel表格功能的命令,主要是排序、提取列,計數、篩選、去冗餘,查找,切割,替換,合併,補齊。

sort #排序, sort lines of text files 對文件的數據進行排序(默認根據ASCII表升序排列)  cut # 提取列,可以以列(欄位)為單位處理數據  wc # 計數  grep # 篩選  uniq # 去冗餘  grep # 查找  awk # 切割  tr,sed # 替換  cat, paste # 合併,補齊  

這些命令也很好練習,還是根據幫助文檔和配套習題即可,在linux系統裡面,甚至可以針對一個文件就玩轉全部的這些命令。

初學者需要花費時間和精力來體驗它們的各種參數效果。比如grep就可以進行查找和篩選,提供它這些功能的參數主要是:

-v ## 逆向匹配  -w ## 匹配上整個words  -B ## 輸出匹配行之前的指定的行數 -A ## 輸出匹配行之後的指定的行數 -E ## 指定支援擴展表達式  -C ## 對匹配到的行計數  -n ##輸出計數後的一行  -o ## -n形式輸出匹配的內容  

值得一提的是,grep,awk,sed被我稱為linux下的文本處理三駕馬車,其中awk和sed命令, 還專門有一個400頁的書籍來進行講解,這裡就不強調大家稱為兩個命令高手了,一定要是有需求再學習,但是需要對它有一定的基礎認知,做到隨學隨用!

第三階段:元字元,通配符及shell中的各種擴展

完成了前面兩個階段的學習,可以得心應手的的操作各種文件夾及文件,還能對文本文件進行類Excel表格探索, 就差不多是半隻腳踏入linux大門了。很明顯這樣仍然是不夠的,充其量你只是換了一個linux環境來完成你之前在Windows或者MacOS這樣的桌面作業系統裡面的日常辦公罷了,linux去可視化的魅力你完全沒有體會到。比如你想通過滑鼠點擊的方式新建10個,100個,甚至1000個文件夾,可能是會到猴年馬月才能完成,但是在linux命令行,只需要短小精悍的一句話即可:

mkdir -p dir{1..1000}  

我們想要的1000個文件夾就瞬間生成,而且還可以在文件夾下面繼續嵌套,甚至都不需要進入該文件夾。

我們之所以可以在linux達到如此驚人的工作效率,得益於我們對其高級知識的掌握。這裡就是{1..100}語法,是shell的擴展,shell擴展有以下幾種,並按以下順序處理,當然如果沒找到匹配的擴展格式,那就不處理

  • brace expansion 大括弧({})擴展
  • tilde expansion ~字元擴展
  • parameter and variable expansion 參數和變數擴展
  • arithmetic expansion 算術擴展
  • command substitution 命令替換
  • process substitution 過程替換
  • word splitting
  • Filename Expansion 通配符擴展

以上擴展中,只有brace expansion,word splitting,filename expansion 三種擴展可以改變token個數,我們演示的{1..100}語法就是這個大括弧擴展(brace expansion)的序列輸出功能,其中兩個點是進行序列輸出,然後外面套的大括弧是進行擴展,這樣我們就一下子新建了成百上千個文件夾。

然後需要掌握的知識點,是linux shell通配符(wildcard),實際上就是一種shell實現的路徑擴展功能,就是前面提到的Filename Expansion 通配符擴展。在 通配符被處理後, shell會先完成該命令的重組,然後再繼續處理重組後的命令,直至執行該命令。

shell常見通配符不多,如下圖:

加快效率的最後一個必備知識點就是shell元字元(特殊字元 Meta),就是一系列自己的其他特殊字元。比如我們在演示 cd 這個命令的時候,提到過一系列高級操作,如下:

cd  ## 回到用戶家目錄  cd  ~ ## 回到用戶家目錄  cd - # 回到前個目錄  cd  .. ## 切換到上層目錄,相對路徑  cd  ../.. ## 切換到上上層目錄  cd  / ## 切換到根目錄  cd  /teach/ ## 切換到根目錄下的teach,絕對路徑  

這裡面的特殊字元就是shell元字元啦,還有一系列其它shell元字元,如下表:

熟練掌握這些特殊字元,就可以很容易看懂大神那些看起來是鬼畫符一樣的NGS流程啦,比如:

第四階段:高級目錄管理

主要是理解軟硬鏈接,絕對路徑和相對路徑,環境變數這些概念,以前你在Windows或者MacOS這樣的桌面作業系統裡面是接觸不到這些概念的,因為那些電腦是需要賣給千家萬戶,各個階層的普通人,要足夠傻瓜化的操作才符合大眾的定位和認知。但是我們生信工程師作為某種程度的專業人士,要學的更深入,看的更遠。

比如,你可以在視窗作業系統打開QQ或者微信這樣的介面版軟體,在上面談天說地,打開網路瀏覽器暢遊知識的海洋,你肯定不會去思考,為什麼我點擊桌面的QQ圖表,電腦就自動打開了QQ這個軟體呢?同樣的,你也不會想到,為什麼我是linux的命令行交互介面輸入 ls 就能列出我當前文件夾裡面的內容呢?

type命令用來顯示指定命令的類型,判斷給出的指令是內部指令還是外部指令。主要的命令類型:

  • alias:別名。
  • keyword:關鍵字,Shell保留字。
  • function:函數,Shell函數。
  • builtin:內建命令,Shell內建命令。
  • file:文件,磁碟文件,外部命令。
  • unfound:沒有找到。

你會發現很多命令,都存在於下面的目錄:

/usr/local/sbin  /usr/local/bin  /usr/sbin  /usr/bin  /sbin  /bin  

這難道是一種巧合嗎?當然不是啦, 如果你 echo $PATH 就能發現這些目錄都是存儲在 PATH 這個變數,在shell裡面的變數需要使用 這個美元符合來進行標識。這個PATH變數就是我們的環境變數啦,掌握它是linux的一個分水嶺,我們生物資訊學領域大名鼎鼎的conda軟體,就是通過修改你的環境變數PATH值來進行軟體管理。

不僅僅是PATH,linux系統還預設了大量的變數,大全如下:

$SHELL     默認Shell  $HOME      當前用戶家目錄  $IFS       內部欄位分隔符  $LANG      默認語言  $PATH      默認可執行程式路徑  $PWD       當前目錄  $UID       當前用戶ID  $USER      當前用戶  $HISTSIZE  歷史命令大小,可通過HISTTIMEFORMAT變數設置命令執行時間  $RANDOM    隨機生成一個0至32767的整數  $HOSTNAME  主機名    $0:保存當前程式或腳本的名稱  $*:保存傳遞給腳本或進程的所有參數  $$:當前進程給腳本的PID號  $!:後台運行的最後一個進程的PID號  $?:用於返回上一條命令是否成功執行。如果成功執行,將返回數字0,否則返回非零數字(通常情況下都返回數字1)。  $#:用於保存腳本的參數個數  

其實歸根結底,是對shell的變數這個概念的掌握。

然後兩個比較容易被忽略,但是也確實非常重要的概念是絕對路徑和相對路徑:

  • 絕對路徑:從根目錄 / 開始,用 / 隔開的各級目錄,例如 /home/vip1 這個目錄。
  • 相對路徑:目標目錄相對於當前目錄的位置。主要是活學活用 ... 這兩個特殊字元。

雖然路徑這個知識點簡單,但是確實大家容易犯錯的,比如:

學員就會以為是自己的腳本有問題,實際上報錯寫的清清楚楚,找不到文件,就是絕對路徑和相對路徑的問題,有時候其它文件夾路徑太深,我們會採取軟鏈接的方式來減輕程式碼量或者某個文件夾需要經常訪問,也可以鏈接到主目錄下面,避免每次cd太多層目錄。

其實就是大家桌面的快捷方式,點擊就可以直接進入你存放在D盤某個文件夾深處,避免每次頻繁點擊進入查找。

第五階段:任務提交及批處理,腳本編寫

任務提交在生物資訊學領域是一個剛需,因為大量的NGS數據處理流程耗時都很長,如果僅僅是運行命令會面臨電腦的命令行交互介面被佔用幾個小時以上時間,需要提交任務到其它節點,取決於大家的實際電腦資源,或者在單機上面直接提交到後台,就是格式是 nohup (要提交的任務) & , 比如我們提交一個命令

sleep 100  # 這個命令提交後系統進入睡眠狀態,時間是100秒,它會佔用我們的命令行,再輸入任何命令也不起作用。  # 我們可以用下面的命令,來把任務提交到後台運行,這樣我們就可以繼續使用命令行。  nohup sleep 100 &  # 提交任務後可以通過 ps -ef | grep sleep 來查看後台sleep任務的運行情況  # 也可以提供fg等命令把掛在後台的命令拿回來  

批處理更多的時候屬於編程的概念了,我們前面演示的短小精悍的一句話即可1000個文件夾瞬間生成

mkdir -p dir{1..1000}  

就是一種批處理的概念,等價於循環,我們這裡只推薦大家學習兩個語法

for i in {1..1000};do (mkdir -p dir${i});done  echo {1..1000}|tr ' ' 'n'| while read id;do ( mkdir -p dir${id});done  

基本上來說,掌握了 for和while就足夠了,腳本編寫就更為複雜了,大綱如下:

第六階段:軟體安裝及conda管理

雖然是,現在有了小白福音,conda來管理大量的生物資訊學軟體,但大量關於conda使用的疑問都是大家對linux基礎知識掌握不夠牢固造成的。我還是推薦大家參考 生物資訊學常見1000個軟體的安裝程式碼! 來安裝部分常用軟體,至少安裝100+軟體,力圖掌握其中的規律。最後才推薦可以平穩過渡到conda管理軟體。

軟體安裝的規律我總結如下:

  • 二進位可執行程式,解壓即可使用
  • https://www.ncbi.nlm.nih.gov/sra/docs/toolkitsoft/
  • ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/LATEST/
  • http://hgdownload.soe.ucsc.edu/admin/exe/linux.x86_64/blat/
  • 系統級別的,演示ubuntu系統的apt功能
  • 程式語言級別
  • C源程式碼
    • cd 到家目錄
    • vim ~/.bashrc
    • G跳轉最後一行
    • i 輸入 export PATH=$PATH: ~/opt/biosoft/…/bin/
    • wq退出
    • source .bashrc
    • which …
    • 編譯型語言
    • 源程式碼:下載—解壓—編譯—安裝
    • http://www.htslib.org/download/
    • 二進位:下載—解壓—安裝
    • wget + 網址
    • 添加到環境變數
  • java/python/perl/R

conda的下載和安裝見conda官網,我們也在生信技能樹寫過系列推文conda管理生信軟體一文就夠 , 主要是需要理清楚下面這些概念:

  • miniconda安裝
  • miniconda配置鏡像
  • 創建小環境
  • 查看小環境
  • 進入小環境
  • 查找軟體
  • 安裝軟體
  • 指定軟體安裝版本
  • 更新軟體
  • 查看已安裝軟體
  • 退出小環境
  • 移除小環境

大部分人的疑問集中在使用conda安裝軟體結束後,無法得心應手的管理它們,尤其有些需要調py的一些包的時候,會出錯,或者python版本不兼容,在使用軟體的時候,軟體即會出現異常報錯。

寫在後面

Linux的學習肯定不止我提到的這6個階段知識點,雖然說大部分人其實連這6點都做的很差,但也有少量生信人員會進階到伺服器管理,運維工作,如果確實條件受限團隊無法納入專職運維,自己也可以在上面知識點基礎上面更新自己的思維層次,從更深入的書籍或者教學影片中繼續學習,我這裡僅僅是列出我工作過程接觸到的少量高級知識點

w/last/top/qsub/condor/apache/socket/IO/ps/who/uid/  磁碟掛載/格式化/重啟系統/文件清理/IP查看/網路管理/用戶管理/目錄結構了解/計劃任務/各種庫文件  用戶組,目錄許可權管理等等  

牢記「不懂的名詞,感覺Google搜索,多記筆記」。在學習Linux基礎知識的同時,就可以開始項目實戰,在實戰的過程中要隨時思考記錄如何應用Linux知識輔助生物資訊數據處理,並整理學習筆記以及經驗分享。

引用: