Linux學習教程

歡迎關注天下博客:http://blog.genesino.com/2017/06/bash1/
Jump to...

  1. 本教程宗旨 (請仔細閱讀)
  2. 為什么要用Linux系統(tǒng)
  3. 如何獲取Linux系統(tǒng)
  4. 初識Linux系統(tǒng)
  5. 我的電腦在哪淳玩?
  6. 獲取可用命令行參數(shù)
  7. 文件上下翻轉(zhuǎn)和左右翻轉(zhuǎn)
  8. 其它新建文件的方式
  9. Linux下文件操作
  10. Linux下命令的一些異常情況
  11. Linux下文件內(nèi)容操作
  12. Linux終端常用快捷操作
  13. Linux下的標準輸入煌恢、輸出需曾、重定向、管道
  14. 文件的可執(zhí)行屬性和環(huán)境變量
  15. 環(huán)境變量的補充
  16. 文件內(nèi)容操作 (二)
  17. 文件排序
  18. FASTA序列提取
  19. 命令運行監(jiān)測
  20. 文件系統(tǒng)和磁盤信息監(jiān)測
  21. 軟件安裝
  22. 系統(tǒng)包管理器安裝
  23. 源碼編譯安裝
  24. Python包的安裝
  25. Anaconda的兩個福利
  26. R包的安裝
  27. 備注
  28. Original link
  29. 微信公眾號

本教程宗旨 (請仔細閱讀)

本教程不是一個完備的Linux使用教程嘉抒,而是側重于一般教程默認讀者會了的信息,包括基本概念的解釋 (方便初學者了解自己的操作)炼绘、命令的各種錯誤及解決 (通常寫教程的都是對這一領域比較熟悉的织盼,一般不會提到這些初學者剛開始不好理解的簡單錯誤)、部分常用命令 (會提到基本用法盗似,具體的使用還請查看手冊或在線搜索)哩陕、常用快捷鍵 (簡化操作)和組合命令 (快速的批處理等,初學者一般不會想到赫舒、高級學者又不屑于提起的部分)悍及。

為什么要用Linux系統(tǒng)

個人認為,Linux操作系統(tǒng)和類Linux操作系統(tǒng)的命令行界面是最適合進行生物信息分析的操作系統(tǒng)接癌。原因有三點:

  • 長期運行的穩(wěn)定性
  • 多數(shù)軟件只有Linux版本
  • 強大的Bash命令簡化繁瑣的操作心赶,尤其是大大簡化重復性工作

但對于初學者來說,接觸和理解Linux操作系統(tǒng)需要一些時間和摸索扔涧。陡然從可視化點選操作的Windows進入到只有命令行界面的Linux园担,最大的陌生感是不知道做什么,不知道文件在哪枯夜?本文希望能通過幾個示例幫助大家適應Linux系統(tǒng)弯汰。

如何獲取Linux系統(tǒng)

  • 如果自己的單位有共有服務器,可以嘗試申請賬號湖雹。
  • 自己的電腦安裝雙系統(tǒng)或虛擬機
  • 購買一塊云服務器
  • 試驗下在線學習平臺實驗樓 https://www.shiyanlou.com (里面也有不少Linux教程咏闪,任意點一個進去,雙擊桌面的Xfce圖標摔吏,都可以啟動Linux終端)
  • <生信寶典>微信公眾號后臺回復向管理員索要

初識Linux系統(tǒng)

登錄Linux系統(tǒng)后鸽嫂,呈現(xiàn)在眼前的是這樣一個界面:

Last login: Mon Jun  5 16:56:56 2017 from 219.241.208.209

Welcome to aliyun Elastic Compute Service!

ct@ehbio:~$ 

首先解釋下出現(xiàn)的這幾個字母和符號:

  • ct: 用戶名
  • ehbio:如果是登錄的遠程服務器,則為宿主機的名字
  • ~: 代表家目錄, 在我們進入新的目錄后征讲,這個地方會跟著改變
  • $: 用來指示普通用戶輸入命令的地方据某;對根用戶來說一般是#
  • http://bashrcgenerator.com/可視化定制不同的顯示方式。

我的電腦在哪诗箍?

打開Windows癣籽,首先看到的是桌面;不愛整理文件的我滤祖,桌面的東西已經(jīng)多到需要2個屏幕才能顯示的完筷狼。另外一個常用的就是我的電腦,然后打開D盤匠童,依次點開對應的文件夾埂材,然后點開文件。

Linux的文件系統(tǒng)組織方式與Windows略有不同汤求,登錄進去就是家目錄俏险,可視為Windows下的桌面严拒。在這個目錄下,我們可以新建文件竖独、新建文件夾糙俗,就像在桌面上的操作一樣。

注:

  • 這里我們假設所有用到的文件和文件夾都放置于家目錄下
  • Linux的家目錄嚴格來說可能類似于Windows下的C:\Users\ct

如果想查看當前目錄下都有什么內(nèi)容预鬓,輸入命令 ls,回車即可 (ls可以理解為單詞list的縮寫)赊颠。當前目錄下什么也沒有格二,所以沒有任何輸出。

ct@ehbio:~$ ls

如果錯把l看成了i竣蹦,輸入了is顶猜,則會出現(xiàn)下面的提示未找到命令。如果輸入的是Linux基本命令痘括,出現(xiàn)這個提示长窄,基本可以判定是命令輸入錯了,瞪大眼睛仔細看就是了纲菌。 在敲完命令回車后挠日,注意查看終端的輸出,以判斷是否有問題翰舌。

ct@ehbio:~$ is
-bash: is: 未找到命令
# 大小寫敏感
ct@ehbio:~$ lS
-bash: lS: 未找到命令

當前目錄下只有一個文件嚣潜,看不出效果,我們可以新建幾個文件和文件夾椅贱,來查看下懂算。

mkdir是新建一個目錄 (make a directory);data是目錄的名字庇麦。 如果目錄存在计技,則會出現(xiàn)提示,”無法創(chuàng)建已存在的目錄”山橄。這時可以使用參數(shù)-p忽略這個錯誤垮媒。

ct@ehbio:~$ mkdir data
ct@ehbio:~$ mkdir ls
data
ct@ehbio:~$ mkdir data
mkdir: 無法創(chuàng)建目錄"data" : 文件已存在
ct@ehbio:~$ mkdir -p data

cat是一個命令,主要用來查看文件驾胆;在這與<<END連用用于讀入大段數(shù)據(jù)涣澡。輸入cat <<END之后,回車丧诺,會看到終端出現(xiàn)一個大于號入桂,大于號后面可以輸入內(nèi)容,再回車驳阎,繼續(xù)輸入內(nèi)容抗愁,直到我們輸入END (大寫的馁蒂,與上面一致),輸入過程結束蜘腌,我們輸入的內(nèi)容都顯示在了屏幕上沫屡。

ct@ehbio:~$ mkdir data
ct@ehbio:~$ cat <<END
> a
> bc
> END
a
bc

`>`是一個重定向符號,即把前面命令的輸出寫入到`>`后面的文件中撮珠。如下所示沮脖,新建了一個`Fasta`格式的文件。
`ls -l`列出文件的詳細信息芯急;`-l`表示命令行參數(shù)勺届,是程序預留的一些選項,保證在不更改程序的情況下獲得更靈活的操作。可使用`man ls`查看`ls`所有的命令行參數(shù), 上下箭頭翻頁排惨,按`q`退出查看。(man: manual, 手冊)

```bash
ct@ehbio:~$ cat <<END >data/test.fa
> >SOX2
> ACGTCGGCGGAGGGTGGSCGGGGGGGGAGAGGT
> ACGATGAGGAGTAGGAGAGAGGAGG
> >OCT4
> ACGTAGGATGGAGGAGAGGGAGGGGGGAGGAGAGGAA
> AGAGTAGAGAGA
> >NANOG
> ACGATGCGATGCAGCGTTTTTTTTTGGTTGGATCT
> CAGGTAGGAGCGAGGAGGCAGCGGCGGATGCAGGCA
> ACGGTAGCGAGTC
> >mYC HAHA
> ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
> CAGGACAGGAGCTA
> end
> END
## 注意命令和參數(shù)之間的空格
ct@ehbio:~/data$ ls-l
-bash: ls-l: 未找到命令
ct@ehbio:~$ ls -l
總用量 4
## d: dir; 表示data是個目錄
## rwx:表示目錄的權限胚膊,暫時忽略,或自己在線搜索
drwxrwxr-x 2 ct ct 4096 6月   8 14:52 data
ct@ehbio:~$ ls -l data
總用量 4
## 開頭的`-`表示test.fa是個文件
-rw-rw-r-- 1 ct ct 284 6月   8 14:48 test.fa

查看寫入的文件的內(nèi)容想鹰,cat 文件名紊婉;需要注意的是文件所在的目錄,默認是當前目錄杖挣;如下面第一個命令肩榕,會提示cat: test.fa: 沒有那個文件或目錄,是因為當前目錄下不存在文件test.fa惩妇。(注意文件末尾的end)

ct@ehbio:~$ cat test.fa
cat: test.fa: 沒有那個文件或目錄
ct@ehbio:~$ cat data/test.fa 
>SOX2
ACGTCGGCGGAGGGTGGSCGGGGGGGGAGAGGT
ACGATGAGGAGTAGGAGAGAGGAGG
>OCT4
ACGTAGGATGGAGGAGAGGGAGGGGGGAGGAGAGGAA
AGAGTAGAGAGA
>NANOG
ACGATGCGATGCAGCGTTTTTTTTTGGTTGGATCT
CAGGTAGGAGCGAGGAGGCAGCGGCGGATGCAGGCA
ACGGTAGCGAGTC
>mYC HAHA
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

test.fa在目錄data下株汉,可以先進入data目錄,然后再查看文件歌殃。類比于Windows下先點開一個文件夾乔妈,再點開下面的文件。

cd (change dir)切換目錄氓皱。

head查看文件最開始的幾行路召,默認為10行,可使用-n 6指定查看前6行波材。

ct@ehbio:~$ cd data
ct@ehbio:~/data$ head -n 6 test.fa 
>SOX2
ACGTCGGCGGAGGGTGGSCGGGGGGGGAGAGGT
ACGATGAGGAGTAGGAGAGAGGAGG
>OCT4
ACGTAGGATGGAGGAGAGGGAGGGGGGAGGAGAGGAA
AGAGTAGAGAGA

另外lessmore也可以用來查看文件股淡,尤其是文件內(nèi)容特別多的時候。

ct@ehbio:~/data$ less test.fa 
# q: 退出
# 上下箭頭廷区、空格翻頁

獲取可用命令行參數(shù)

前面使用的命令唯灵,有幾個用到了參數(shù)如ls -l, head -n 6等,需要注意的是命令跟參數(shù)之間要有空格隙轻。

終端運行man ls可以查看ls所有可用的參數(shù)埠帕,上下箭頭翻頁垢揩,按q退出查看。(man: manual, 手冊)

ct@ehbio:~/data$ man ls
NAME
 ls - list directory contents

SYNOPSIS
 ls [OPTION]... [FILE]...

DESCRIPTION
 List  information  about  the  FILEs  (the current directory by default).
 Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.

 Mandatory arguments to long options are mandatory for short options too.

 -a, --all
  do not ignore entries starting with .

 -A, --almost-all
  do not list implied . and ..

 --author
  with -l, print the author of each file

 -b, --escape
  print C-style escapes for nongraphic characters
 ....

文件上下翻轉(zhuǎn)和左右翻轉(zhuǎn)

兩個有意思的命令敛瓷,tac: 文件翻轉(zhuǎn)叁巨,第一行變?yōu)樽詈笠恍校诙凶優(yōu)榈箶?shù)第二行呐籽;rev每列反轉(zhuǎn)锋勺,第一個字符變?yōu)樽詈笠粋€字符,第二個字符變?yōu)榈箶?shù)第二個字符狡蝶。

ct@ehbio:~/data$ cat <<END | tac
> first
> second
> third
> END
third
second
first
ct@ehbio:~/data$ cat <<END | rev
> abcde
> xyz
> END
edcba
zyx

其它新建文件的方式

nano類似于Windows下記事本的功能宙刘,nano filename就可以新建一個文件,并在里面寫內(nèi)容牢酵;ctrl+x退出,根據(jù)提示按Y保存衙猪。

vim 功能更強大的文本編輯器馍乙。vim filename就可以新建一個文件, 敲擊鍵盤字母i,進入寫作模式垫释。寫完后丝格,敲擊鍵盤Esc, 退出寫作模式,然后輸入:w (會顯示在屏幕左下角)棵譬,回車保存显蝌。vim的常用方法,以后會單寫一個订咸,這里點到為止曼尊。

Linux下文件操作

常用的文件操作有移動文件到另一個文件夾、復制文件到另一個文件夾脏嚷、文件重命名等骆撇。

cp (copy): 拷貝文件或文件夾 (cp -r 拷貝文件夾時的參數(shù),遞歸拷貝)

# 列出當前目錄下有的文件和文件夾
ct@ehbio:~$ ls
data

# 新建一個文件夾
ct@ehbio:~$ mkdir ehbio_project

# 列出當前目錄下有的文件和文件夾, 及其子文件夾的內(nèi)容
# data目錄下有一個文件父叙,ehbio_project目錄下無文件
ct@ehbio:~$ ls *
data:
test.fa

ehbio_project:

# 拷貝data目錄下的文件test.fa到ehbio_project目錄下
ct@ehbio:~$ cp data/test.fa ehbio_project/

# 列出當前目錄下有的文件和文件夾, 及其子文件夾的內(nèi)容
# data目錄下有一個文件神郊,ehbio_project目錄下無文件
ct@ehbio:~$ ls *
data:
test.fa

ehbio_project:
test.fa

mv (move): 移動文件或文件夾

# 重命名data目錄下的文件test.fa為first.fa
# mv除了可以移動文件,也可以做單個文件的重命名
ct@ehbio:~$ mv data/test.fa data/first.fa

# 列出當前目錄下有的文件和文件夾,  及其子文件夾的內(nèi)容
ct@ehbio:~$ ls *
data:
first.fa

ehbio_project:
test.fa

rename: 文件重命名 (常用于批量重命名趾唱,不同的系統(tǒng)可能用法略有不同涌乳,使用前先man rename查看使用方法)

# 進入另一個目錄
ct@ehbio:~$ cd ehbio_project/
ct@ehbio:~/ehbio_project$ ls
test.fa

# 給文件做一份拷貝
ct@ehbio:~/ehbio_project$ cp test.fa second.fa
ct@ehbio:~/ehbio_project$ ls
second.fa  test.fa

# 給文件多拷貝幾次,無聊的操作甜癞,就是為了給rename提供發(fā)揮作用的機會
ct@ehbio:~/ehbio_project$ cp test.fa test2.fa
ct@ehbio:~/ehbio_project$ cp test.fa test3.fa
ct@ehbio:~/ehbio_project$ cp test.fa test4.fa

# cp 后面需要2個參數(shù)夕晓,被拷貝的文件和要被拷貝到的目錄或文件
# 出現(xiàn)下面的錯誤,表示缺少目標路徑或文件
ct@ehbio:~/ehbio_project$ cp ehbio.fa 
cp: 在" ehbio.fa"  后缺少了要操作的目標文件
Try 'cp --help' for more information.

ct@ehbio:~/ehbio_project$ ls
second.fa  test2.fa  test3.fa  test4.fa  test.fa

# 用rename進行文件批量重命名
ct@ehbio:~/ehbio_project$ rename 'test' 'ehbio' test*.fa
ct@ehbio:~/ehbio_project$ ls
ehbio2.fa  ehbio3.fa  ehbio4.fa  ehbio.fa  second.fa

ln (link): 給文件建立快捷方式 (ln -s source_file target 創(chuàng)建軟連接)带欢。

在建立軟連接時运授,原文件要使用全路徑烤惊。全路徑指以/開頭的路徑。

建立軟連接吁朦,是為了在不增加硬盤存儲的情況下柒室,簡化文件訪問方式的一個辦法。把其它文件夾下的文件鏈接到當前目錄逗宜,使用時只需要寫文件的名字就可以了雄右,不需要再寫長串的目錄了。

../: 表示上一層目錄纺讲;../../: 表示上面兩層目錄

pwd (print current/working directory): 輸出當前所在的目錄

\``為鍵盤Esc下第一個按鍵 (與家目錄~`符號同一個鍵)擂仍,寫在反引號內(nèi)的命令會被運行乡括,運行結果會放置在反引號所在的位置

# 建立軟連接哀蘑,把當前目錄下的ehbio2.fa栅受,鏈接到上一層目錄的data下面

# 這是一個無效的軟連接,
ct@ehbio:~/ehbio_project$ ln -s ehbio2.fa ../data

# 在使用ls查看時巾钉,無效的軟連接的文件名下面是黑色的背景吼旧。
ct@ehbio:~/ehbio_project$ ls -l ../data/
總用量 4
lrwxrwxrwx 1 ct ct   9 6月   9 17:55 ehbio2.fa -> ehbio2.fa
-rw-rw-r-- 1 ct ct 284 6月   8 14:48 first.fa

# 輸出當前所在的目錄
ct@ehbio:~/ehbio_project$ pwd
/home/ct/ehbio_project

# 建立軟連接時,原始文件一定使用全路徑海铆。全路徑指以/開頭的路徑。
ct@ehbio:~/ehbio_project$ ln -s /home/ct/ehbio_project/ehbio2.fa ../data
ln: 無法創(chuàng)建符號鏈接" ../data/ehbio2.fa" : 文件已存在

# 上面的錯誤信息時刺啦,已經(jīng)存在這么一個鏈接了(雖然是無效的),但再建新的鏈接時還會提示
# 使用`-f` (force)強制覆蓋已有的鏈接
ct@ehbio:~/ehbio_project$ ln -fs `pwd`/ehbio2.fa ../data

# 再次查看時,就正常了汉操。文件名下面沒有了背景色楞陷,并且有個右箭頭指向原始文件
# `lrwxrwxrwx`中的`l`表示軟連接怔鳖。
ct@ehbio:~/ehbio_project$ ls -l ../data/
總用量 4
lrwxrwxrwx 1 ct ct  32 6月   9 17:56 ehbio2.fa -> /home/ct/ehbio_project/ehbio2.fa
-rw-rw-r-- 1 ct ct 284 6月   8 14:48 first.fa

# 通常為了簡化寫法,使用`pwd`代替全路徑
# `為鍵盤Esc下面的按鍵艾凯,寫在反引號內(nèi)的命令會被運行昌犹,運行結果會放置在反引號所在的位置
ct@ehbio:~/ehbio_project$ ln -s `pwd`/ehbio2.fa ../data
ln: 無法創(chuàng)建符號鏈接" ../data/ehbio2.fa" : 文件已存在
ct@ehbio:~/ehbio_project$ ln -fs `pwd`/ehbio2.fa ../data
ct@ehbio:~/ehbio_project$ ls -l ../data/
總用量 4
lrwxrwxrwx 1 ct ct  32 6月   9 17:56 ehbio2.fa -> /home/ct/ehbio_project/ehbio2.fa
-rw-rw-r-- 1 ct ct 284 6月   8 14:48 first.fa

Linux下命令的一些異常情況

命令不全:在命令沒有輸入完 (引號或括號沒有配對),就不小心按下了Enter鍵览芳,終端會提示出一個>代表命令不完整斜姥,這是可以繼續(xù)輸入,也可以ctrl+c終止輸入,重新再來铸敏。(下面sed命令使用時缚忧,還有另外一種命令不全的問題)

ct@ehbio:~/ehbio_project$ rename 'ehbio2
>'
ct@ehbio:~/ehbio_project$ rename 'ehbio2
> ^C
ct@ehbio:~/ehbio_project$

文件名輸入錯誤: 多一個字母、少一個字母杈笔、大小寫問題

ct@ehbio:~/ehbio_project$ls
ehbio2.fa  ehbio3.fa  ehbio4.fa  ehbio.fa  second.fa

# 重命名沒有生效
ct@ehbio:~/ehbio_project$ rename 'ehbio2' 'ehbio5' ebio2.fa
ct@ehbio:~/ehbio_project$ ls
ehbio2.fa  ehbio3.fa  ehbio4.fa  ehbio.fa  second.fa

# 仔細看是ehbio2.fa寫成了ebio2.fa闪水,更正后即可。
Z8vb3e9jtel4m99ss6e7eZ:~/ehbio_project$ rename 'ehbio2' 'ehbio5' ehbio2.fa
ct@ehbio:~/ehbio_project$ ls
ehbio3.fa  ehbio4.fa  ehbio5.fa  ehbio.fa  second.fa

所在目錄不對: 訪問的文件不存在于當前目錄蒙具,而又沒有提供絕對路徑, 或軟連接失效

ct@ehbio:~/ehbio_project$ ls
ehbio3.fa  ehbio4.fa  ehbio5.fa  ehbio6.fa  ehbio.fa  second.fa
ct@ehbio:~/ehbio_project$ ls ../data
ehbio2.fa  first.fa

# 當前目錄沒有ehbio2.fa
ct@ehbio:~/ehbio_project$ less ehbio2.fa
ehbio2.fa: 沒有那個文件或目錄

# ehbio2.fa在上一層目錄的data目錄下
ct@ehbio:~/ehbio_project$ ls ../data/ehbio2.fa 
../data/ehbio2.fa

# 加上路徑依然訪問不了 
ct@ehbio:~/ehbio_project$ less ../data/ehbio2.fa 
../data/ehbio2.fa: 沒有那個文件或目錄

# 上面的問題是軟連接失效球榆,在之前的操作中刪掉了原始的ehbio2.fa,所以快捷方式失效

# 正確的訪問
ct@ehbio:~/ehbio_project$ tail -n 3 ../data/first.fa 
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

Linux下文件內(nèi)容操作

常用的文件內(nèi)容操作有文件壓縮解壓縮禁筏、文件大小行數(shù)統(tǒng)計持钉、文件內(nèi)容查詢等。

gzip: 壓縮文件; gunzip: 解壓縮文件

# gzip -c 把壓縮的文件輸出到標準輸出 (一般是屏幕)
# '>' 輸出重定向篱昔,輸出寫入文件

ct@ehbio:~/ehbio_project$ gzip -c ehbio.fa >ehbio.fa.gz

# 多了一個.gz文件
ct@ehbio:~/ehbio_project$ ls
ehbio3.fa  ehbio4.fa  ehbio5.fa  ehbio.fa  ehbio.fa.gz  second.fa

#解壓縮
ct@ehbio:~/ehbio_project$ gunzip ehbio.fa.gz
gzip: ehbio.fa already exists; do you wish to overwrite (y or n)? y
ct@ehbio:~/ehbio_project$ ls
ehbio3.fa  ehbio4.fa  ehbio5.fa  ehbio.fa  second.fa

wc (word count): 一般使用wc -l獲取文件的行數(shù)

# 輸出文件有14行
ct@ehbio:~/ehbio_project$ wc -l ehbio.fa
14 ehbio.fa

獲取文件中包含大于號 (>)的行, grep (print lines matching a pattern)每强。 grep的用法很多,支持正則表達式匹配州刽,這里不展開空执,可以自己查閱資料,或在后期的教程涉及到時再學習穗椅。

ct@ehbio:~/ehbio_project$ grep '>' ehbio.fa
>SOX2
>OCT4
>NANOG
>mYC HAHA

# 獲取包含>的行的行數(shù) (-c: count lines)
ct@ehbio:~/ehbio_project$ grep -c '>' ehbio.fa
4

# 是不是還記得當時新建文件時辨绊,末尾多了一行end,刪除end所在行
ct@ehbio:~/ehbio_project$ less ehbio.fa 

# -v: 不輸出匹配上的行
ct@ehbio:~/ehbio_project$ grep -v 'end' ehbio.fa >ehbio6.fa
ct@ehbio:~/ehbio_project$ cat ehbio6.fa 
>SOX2
ACGTCGGCGGAGGGTGGSCGGGGGGGGAGAGGT
ACGATGAGGAGTAGGAGAGAGGAGG
>OCT4
ACGTAGGATGGAGGAGAGGGAGGGGGGAGGAGAGGAA
AGAGTAGAGAGA
>NANOG
ACGATGCGATGCAGCGTTTTTTTTTGGTTGGATCT
CAGGTAGGAGCGAGGAGGCAGCGGCGGATGCAGGCA
ACGGTAGCGAGTC
>mYC HAHA
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA

替換文件中的字符: sed是一個功能強大的文件內(nèi)容編輯工具匹表,常用于替換门坷、取得行號等操作。

# 第一個錯誤桑孩,漏掉了文件名
# 程序靜止在這,等待用戶的進一步輸入
# ctrl+c殺掉當前命令
ct@ehbio:~/ehbio_project$ sed 's/ HAHA//' | tail -n 3

^C

# 第二個錯誤框冀,文件名和單引號之間沒有空格流椒,使得sed判斷命令錯誤

ct@ehbio:~/ehbio_project$ sed 's/ HAHA//'ehbio.fa  | tail -n 3
sed:-e 表達式 #1,字符 11:“s”的未知選項

# 正確操作明也,

ct@ehbio:~/ehbio_project$ sed 's/ HAHA//' ehbio.fa  | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

另外一個方式宣虾,去除HAHA,使用cut命令 (cut更適合與矩陣操作温数,去除其中的一列或者多列)绣硝。

-f: 指定取出哪一列,使用方法為-f 2 (取出第2列)撑刺,-f 2-5 (取出第2-5列)鹉胖,-f 2,5 (取出第2和第5列)。

-d: 設定分隔符, 默認為TAB鍵。如果一行沒有指定的分隔符甫菠,整行都為第一列挠铲。

ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

Linux終端常用快捷操作

  • 命令或文件名自動補全:在輸入命令或文件名的前幾個字母后,按Tab鍵寂诱,系統(tǒng)會自動補全或提示補全
  • 上下箭頭:使用上下箭頭可以回溯之前的命令拂苹,增加命令的重用,減少輸入工作量
  • !加之前輸入過的命令的前幾個字母痰洒,快速獲取前面的命令
ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end
ct@ehbio:~/ehbio_project$ man cut
# 直接跳到上面運行的cut命令瓢棒,再執(zhí)行一次
ct@ehbio:~/ehbio_project$ !cut
cut -f 1 -d ' ' ehbio.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

  • ctrl+a回到命令的行首,用于修改常命令或注釋掉命令
# 寫完下面的命令丘喻,突然不想運行了脯宿,又不想一個個刪掉
ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio.fa | tail -n 4

# 按ctrl+a, 回到行首,再輸入`#`號仓犬,回車嗅绰,命令即被注釋掉。
ct@ehbio:~/ehbio_project$ #cut -f 1 -d ' ' ehbio.fa | tail -n 4

  • !! 表示上一條命令搀继。
ct@ehbio:~/ehbio_project$ ls
ehbio3.fa  ehbio4.fa  ehbio5.fa  ehbio6.fa  ehbio.fa  second.fa
ct@ehbio:~/ehbio_project$ !!
ls
ehbio3.fa  ehbio4.fa  ehbio5.fa  ehbio6.fa  ehbio.fa  second.fa

  • 替換上一個命令中的字符窘面,再運行一遍命令,用于需要對多個文件執(zhí)行同樣的命令叽躯,又不想寫循環(huán)的情況
# 輸入一個命令
ct@ehbio:~/ehbio_project$ #cut -f 1 -d ' ' ehbio.fa | tail -n 4

# !!表示上一條命令
# :gs表示替換财边,把上一個命令中全部的ehbio替換為ehbio3; g: global; s: substitute
ct@ehbio:~/ehbio_project$ !!:gs/ehbio/ehbio3
#cut -f 1 -d ' ' ehbio3.fa | tail -n 4

# 替換后效果如上

# 去掉命令前的#號
ct@ehbio:~/ehbio_project$ cut -f 1 -d ' ' ehbio3.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

## 替換ehbio3為ehbio4,直接運行命令
ct@ehbio:~/ehbio_project$ !!:gs/ehbio3/ehbio4
cut -f 1 -d ' ' ehbio4.fa | tail -n 4
>mYC
ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
CAGGACAGGAGCTA
end

Linux下的標準輸入点骑、輸出酣难、重定向、管道

| 在Linux系統(tǒng)中黑滴,有4個特殊的符號憨募,<, ‘>’, ‘ | ’, ‘-‘,在我們處理輸入和輸出時存在重要但具有迷惑性的作用袁辈。 |

默認Linux的命令的結果都是輸出到標準輸出菜谣,錯誤信息 (比如命令未找到或文件格式識別錯誤等) 輸出到標準錯誤,而標準輸出和標準錯誤默認都會顯示到屏幕上晚缩。

>表示重定向標準輸出尾膊,> filename就是把標準輸出存儲到文件filename里面。標準錯誤還是會顯示在屏幕上荞彼。

2 >&1 表示把標準錯誤重定向到標準輸出冈敛。Linux終端用2表示標準錯誤,1表示標準輸出鸣皂。

- (短橫線):表示標準輸入抓谴,一般用于1個程序需要多個輸入的時候暮蹂。

<標準輸入,后面可以跟可以產(chǎn)生輸出的命令齐邦,一般用于1個程序需要多個輸入的時候椎侠。

|管道符,表示把前一個命令的輸出作為后一個命令的輸入措拇,前面也有一些展示例子我纪。用于數(shù)據(jù)在不同的命令之間傳輸,用途是減少硬盤存取損耗丐吓。

下面我們通過一個程序stdout_error.sh來解釋上面的文字浅悉,內(nèi)容如下

#!/bin/bash

echo "I am std output" 
# 下面是隨便寫的一個理論上不存在的命令, 理論上會報錯的。
unexisted_command

運行這個腳本

# 標準輸出和標準錯誤默認都會顯示到屏幕上
ct@ehbio:~$ bash stdout_error.sh 
I am std output
stdout_error.sh: line 5: unexisted_command: command not found

# >把結果輸入到了文件券犁;標準錯誤還顯示在屏幕上
ct@ehbio:~$ bash stdout_error.sh >stdout_error.stdout
stdout_error.sh: line 5: unexisted_command: command not found
ct@ehbio:~$ cat stdout_error.stdout
I am std output

# >把結果輸入到了文件; 2>把標準錯誤輸入到了另一個文件
ct@ehbio:~$ bash stdout_error.sh >stdout_error.stdout 2>stdout_error.stderr
ct@ehbio:~$ cat stdout_error.stderr
stdout_error.sh: line 5: unexisted_command: command not found

# 標準輸出和標準錯誤寫入同一個文件
ct@ehbio:~$ bash stdout_error.sh >stdout_error.stdout 2>&1
ct@ehbio:~$ cat stdout_error.stdout
I am std output
stdout_error.sh: line 5: unexisted_command: command not found

下面看管道符和標準輸入的使用术健。

# 管道符的使用
# 第一個命令的輸出作為第二個的輸入
# 前面的例子中也有使用
# tr: 是用于替換字符的,把空格替換為換行粘衬,文字就從一行變?yōu)榱艘涣?ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n'
1
2
3

# cat命令之前也用過荞估,輸出一段文字
# diff是比較2個文件的差異的,需要2個參數(shù)
# - (短橫線)表示上一個命令的輸出稚新,傳遞給diff
# < 表示其后的命令的輸出勘伺,也重定向給diff
ct@ehbio:~$ cat <<END | diff - <(echo "1 2 3" | tr ' ' '\n')
> 2
> 3
> 4
> END
0a1
> 1
3d3
< 4

# 如果不使用管道和重定向標準輸入,程序是這么寫的

# 先把第一部分存儲為1個文件
ct@ehbio:~$ cat <<END >firstfile
2
3
> 4
> END
ct@ehbio:~$ less firstfile 

# 再把第二部分存儲為1個文件
ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n' >secondfile

# 然后比較
ct@ehbio:~$ diff firstfile secondfile 
0a1
> 1
3d3
< 4

管道符的更多應用

ct@ehbio:~$ echo  "actg aaaaa cccccg" | tr ' ' '\n' | wc -l
3

# sed =:先輸出行號褂删,再輸出每行的內(nèi)容
ct@ehbio:~$ echo  "a b c" | tr ' ' '\n' | sed =  
1
a
2
b
3
c

# 后面這個命令不太好解釋
# sed = 同時輸出行號
# N: 表示讀入下一行飞醉;sed命令每次只讀一行,加上N之后就是緩存了第2行屯阀,所有的操作都針對第一行缅帘;
# s: 替換;把換行符替換為\t
ct@ehbio:~$ echo  "a b c" | tr ' ' '\n' | sed = | sed 'N;s/\n/\t/' 
1   a
2   b
3   c

# 后面這個命令不太好解釋
# sed = 同時輸出行號
# N: 表示讀入下一行难衰;sed命令每次只讀一行钦无,加上N之后就是緩存了第2行,所有的操作都針對第一行盖袭;
# s: 替換失暂;把讀取的奇數(shù)行行首加一個'>'(偶數(shù)行相當于被隱藏了)
ct@ehbio:~$ echo  "a b c" | tr ' ' '\n' | sed = | sed 'N;s/^/>/' 
>1
a
>2
b
>3
c

# 把多條序列轉(zhuǎn)成FATSA格式
# sed = 同時輸出行號
# N: 表示讀入下一行;sed命令每次只讀一行苍凛,加上N之后就是緩存了第2行趣席,所有的操作都針對第一行兵志;
# s: 替換醇蝴;把讀取的奇數(shù)行行首加一個'>'(偶數(shù)行相當于被隱藏了)
# 于是FASTA格式序列就出來了
ct@ehbio:~$ echo  "actg aaaaa cccccg" | tr ' ' '\n' | sed = | sed 'N;s/^/>/' 
>1
actg
>2
aaaaa
>3
cccccg

文件的可執(zhí)行屬性和環(huán)境變量

Linux下文件有一個特殊的屬性即可執(zhí)行屬性,用來指示這個文件是一個可執(zhí)行的腳本或可以運行的二進制文件想罕。前面所提到的這些命令悠栓,都具有可執(zhí)行屬性霉涨。

which: 表示查看命令的路徑。一般用于當我們想知道使用的命令來源于什么地方時惭适,比如安裝了多個R或多個python笙瑟,但又分不清用的是哪個時,which一下癞志,立即明了往枷。在這兒我們用which獲取的是可執(zhí)行的命令所在的路徑,進而查看其屬性凄杯。

ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l "`which cd`"
#rwx: 文件所有者可讀错洁、可寫、可執(zhí)行
#r-x: 文件所有者所在組其它成員可讀戒突、可執(zhí)行屯碴,不可修改
#r-x: 其它人可讀、可執(zhí)行膊存,不可修改
-rwxr-xr-x 1 root root 26 12月  7 2016 /usr/bin/cd
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l "`which mkdir`"
-rwxr-xr-x. 1 root root 79768 11月  6 2016 /usr/bin/mkdir
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l "`which python`"
#l: 代表軟連接
#軟連接自身是所有人可讀可寫导而,但具體的權限依賴于其鏈接的文件
lrwxrwxrwx. 1 root root 7 3月  22 15:04 /usr/bin/python -> python2
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l "`which python2`"
#第二層鏈接
lrwxrwxrwx. 1 root root 9 3月  22 15:04 /usr/bin/python2 -> python2.7
#鏈接的原始文件
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l "`which python2.7`"
-rwxr-xr-x. 1 root root 7136 11月  6 2016 /usr/bin/python2.7

文件屬性rwxr表示read (數(shù)字表示為4)、w表示write (數(shù)字表示為2)隔崎、x表示執(zhí)行 (數(shù)字表示為1)今艺。三個未一組,連續(xù)出現(xiàn)三次(如下面命令行中所示), 第一組表示文件的所有者擁有的權限仍稀,第二組為文件所有者所在的用戶組所擁有的權限洼滚,組內(nèi)所有成員都具有的權限,第三組為其它用戶的權限技潘。

chmod a+x file: 表示給文件增加所有人(a)可執(zhí)行權限 (+x)

chmod u+x file: 表示給文件增加所有者(u遥巴,user,)可執(zhí)行權限 (+x)

chmod g+x, chmod o+X: 表示給文件增加組內(nèi)人或其它人可執(zhí)行權限

chmod 755 file: 表示擁有者有可讀寫執(zhí)行權限享幽,其它人有可讀執(zhí)行權限铲掐。(7=4+2+1; 5=4+1)

具體使用man chmod查看其它參數(shù)使用。

# 新建個文件
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ cat <<END >run.sh
> echo " I am a script created by ehbio." 
> END

# 查看其權限值
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l run.sh 
-rw-rw-r-- 1 ct ct 39 6月  14 23:12 run.sh

# 更改權限值
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ chmod 755 run.sh

# 查看其權限值
# 注意多了3個x
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l run.sh 
-rwxr-xr-x 1 ct ct 39 6月  14 23:12 run.sh

# 去除其它用戶的可執(zhí)行權限
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ chmod o-x run.sh 

# 注意看少了個x
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l run.sh 
-rwxr-xr-- 1 ct ct 39 6月  14 23:12 run.sh

# 去除同組的可執(zhí)行權限
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ chmod g-x run.sh

# 注意看又少了個x
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l run.sh 
-rwxr--r-- 1 ct ct 39 6月  14 23:12 run.sh

# 去除所有人的可執(zhí)行權限
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ chmod a-x run.sh
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l run.sh 
-rw-r--r-- 1 ct ct 39 6月  14 23:12 run.sh

# 給所有人增加可執(zhí)行權限
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ chmod a+x run.sh
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ ls -l run.sh 
-rwxr-xr-x 1 ct ct 39 6月  14 23:12 run.sh

如果一個文件有了可執(zhí)行權限值桩,是不是就可以執(zhí)行了摆霉,我們來檢測下。

ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ run.sh
-bash: run.sh: 未找到命令

事實上并非如此奔坟,輸入命令携栋,回車后,提示命令未找打咳秉,這是為什么呢婉支?

這就涉及到環(huán)境變量的概念,通俗的講澜建,環(huán)境變量就是告訴電腦 (實際是操作系統(tǒng))幾個目錄向挖。這幾個目錄下存儲又可執(zhí)行文件蝌以,如前面顯示的/usr/bin目錄,大部分的系統(tǒng)命令都在這個目錄下何之。

當我們輸入命令mkdir時跟畅,系統(tǒng)就會在環(huán)境變量所代表的幾個目錄從前都厚去查找,哪個里面有mkdir文件溶推,然后去執(zhí)行mkdir命令徊件。

系統(tǒng)中環(huán)境變量的名字是PATH,其內(nèi)容可通過下面的命令顯示 (根據(jù)操作系統(tǒng)不同和配置不同蒜危,略有差別庇忌,但格式是統(tǒng)一的,:分割的一堆路徑):

ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

所以如果我們想讓自己的命令能被系統(tǒng)找到舰褪,就需要把命令所在的目錄加到環(huán)境變量里面皆疹,怎么操作呢?

加到環(huán)境變量的路徑必須是全路徑占拍,全路徑指以/開頭或已~開頭的路徑略就。

# 加到環(huán)境變量的路徑必須是全路徑,全路徑指以/開頭或已~開頭的路徑
# 注意第一個PATH不含$, 第二個PATH有$符號
# 我們后面會講什么時候用$, 什么時候不用$
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ export PATH=$PATH:/home/ct
ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ct

這時晃酒,我們在執(zhí)行那個命令試試表牢,成功運行了。

ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ run.sh 
I am a script created by ehbio.

所以在以后安裝了新的軟件贝次,或者寫了新的腳本后崔兴,都把軟件的可執(zhí)行程序可執(zhí)行的腳本所在的目錄,加到環(huán)境變量里面就可以了蛔翅。

但是敲茄,在命令行中執(zhí)行export,對環(huán)境變量所做的修改山析,只對當前終端有效堰燎,退出后就無效了。為了使得這一操作笋轨,長期有效秆剪,我們需要把這句話寫入一個文件中,一個登陸服務器就會被自動讀取的文件中爵政。

對于普通用戶仅讽,在遠程登錄終端時,家目錄下的~/.bash_profile (不是~/.bashrc, 在本地登錄時才會被讀取)會自動被讀取钾挟,所以我們需要把export語句加入到這個文件中洁灵。

# 這是我的~/.bash_profile中的內(nèi)容,主要是最好一行等龙〈υ可以連續(xù)的加入多個路徑。
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

export PATH=$PATH:/home/ct:/home/bin:/home/soft/bowtie2/bin

前面提到蛛砰,系統(tǒng)查找命令的順序是從環(huán)境變量的第一個目錄到最后一個目錄罐栈,在第一次碰到查詢的命令后,就調(diào)用執(zhí)行泥畅。假如系統(tǒng)存在一個python命令荠诬,我們自己又安裝了一個python (假如在/home/ct/anaconda/bin目錄下),如果我們想執(zhí)行自己的python程序位仁,就需要把/home/ct/anaconda/bin寫在$PATH前面柑贞,如下

# 注意$PATH的順序

ct@iZ8vb3e9jtel4m99ss6e7eZ:~$ export PATH=/home/ct/anaconda/bin:$PATH

至此,我們可以熟練使用環(huán)境變量來簡化命令的輸入過程了聂抢,因為如果沒有環(huán)境變量钧嘶,我們就得需要運行/home/ct/anaconda/bin/python來運行python命令了。

環(huán)境變量這塊琳疏,自己多操作下有决,就會慢慢理解熟練了。

環(huán)境變量的補充

PATH只是眾多環(huán)境變量中的一個變量空盼,用于存儲可執(zhí)行文件所在的目錄书幕,以便在用戶輸入命令時可以查詢的到。尤其是自己寫的腳本或安裝的程序揽趾,系統(tǒng)不會知道它們在哪個路徑下台汇,需要我們?nèi)ヌ峁┙o系統(tǒng)這些新的路徑挤土,學名叫設置環(huán)境變量传趾。

此外常用到的環(huán)境變量還有LD_LIBARY_PATH: 指定動態(tài)鏈接庫 (so文件)的位置积糯,一般在安裝軟件出錯時會用到冠骄;PYTHONPATH: 指定Python的安裝包的路徑懦尝;PERL5LIB: 指定perl的安裝包的路徑滓窍。

設置環(huán)境變量要注意2點:1. 設置新的環(huán)境變量時一般要包含原始的環(huán)境變量骄崩,不能覆蓋绍载;2. 注意自己的目錄和系統(tǒng)環(huán)境變量的目錄的順序校哎,想讓哪個先被找到两波,就先放哪個。

文件內(nèi)容操作 (二)

文件排序

seq: 產(chǎn)生一系列的數(shù)字; man seq查看其具體使用闷哆。我們這使用seq產(chǎn)生下游分析所用到的輸入文件腰奋。

# 產(chǎn)生從1到10的數(shù),步長為1
ct@ehbio:~$ seq 1 10
1
2
3
4
5
6
7
8
9
10

# 產(chǎn)生從1到10的數(shù)抱怔,步長為1劣坊,用空格分割
ct@ehbio:~$ seq -s ' ' 1 10
1 2 3 4 5 6 7 8 9 10

# 產(chǎn)生從1到10的數(shù),步長為2
# 如果有3個數(shù)屈留,中間的數(shù)為步長局冰,最后一個始終為最大值
ct@ehbio:~$ seq -s ' ' 1 2 10
1 3 5 7 9

# 還記得前面提到的標準輸入和標準輸出吧
# 后臺回復 標準輸入 查看
ct@ehbio:~$ cat <(seq 0 3 17) <(seq 3 6 18) >test
ct@ehbio:~$ cat test 
0
3
6
9
12
15
3
9
15

sort: 排序测蘑,默認按字符編碼排序。如果想按數(shù)字大小排序康二,需添加-n參數(shù)碳胳。

# 可能不符合預期的排序,系統(tǒng)首先排0沫勿,然后排1, 3, 6, 9
ct@ehbio:~$ sort test
0
12
15
15
3
3
6
9
9
# 按數(shù)字大小排序
ct@ehbio:~$ sort -n test
0
3
3
6
9
9
12
15
15

sort -u: 去除重復的行挨约,等同于sort | uniq

ct@ehbio:~$ sort -nu test
0
3
6
9
12
15

sort file | uniq -d: 獲得重復的行产雹。(d=duplication)

ct@ehbio:~$ sort -n test | uniq -d
3
9
15

sort file | uniq -c: 獲得每行重復的次數(shù)诫惭。

# 第一列為每行出現(xiàn)的次數(shù),第二列為原始的行
ct@ehbio:~$ sort -n test | uniq -c
  1 0
  2 3
  1 6
  2 9
  1 12
  2 15

# 換一個文件看的更清楚
ct@ehbio:~$ cat <<END >test2
> a
> b
> c
> b
> a
> e
> d
> a
> END

# 第一列為每行出現(xiàn)的次數(shù)蔓挖,第二列為原始的行
ct@ehbio:~$ sort test2 | uniq -c
3 a
2 b
1 c
1 d
1 e

# 在執(zhí)行uniq操作前夕土,文件要先排序,不然結果很詭異
ct@ehbio:~$ cat test2 | uniq -c
1 a
1 b
1 c
1 b
1 a
1 e
1 d
1 a

整理下uniq -c的結果瘟判,使得原始行在前隘弊,每行的計數(shù)在后。

awk是一個強大的文本處理工具荒适,其處理數(shù)據(jù)模式為按行處理梨熙。每次讀入一行,進行操作刀诬。OFS: 輸出文件的列分隔符 (output file column separtor)咽扇;FS為輸入文件的列分隔符 (默認為空白字符)。awk中的列從第1到n列陕壹,分別記錄為$1, $2$n质欲。BEGIN表示在文件讀取前先設置基本參數(shù);與之相對應的是END糠馆,只文件讀取完成之后進行操作嘶伟。不以BEGIN, END開頭的{}就是文件讀取、處理的部分又碌。

# 管道符還記得吧九昧,后臺回復 管道 可查看
# awk的操作就是鍍金上一步的結果,去除多余的空白毕匀,然后調(diào)換2列
ct@ehbio:~$ sort test2 | uniq -c | awk 'BEGIN{OFS="\t";}{print $2, $1}'
a   3
b   2
c   1
d   1
e   1

對兩列文件铸鹰,安照第二列進行排序, sort -k2,2n

# 第二列按數(shù)值大小排序
ct@ehbio:~$ sort test2 | uniq -c | awk 'BEGIN{OFS="\t";}{print $2, $1}' | sort -k2, 2n
c   1
d   1
e   1
b   2
a   3

# 第二列按數(shù)值大小排序
# 第二列相同的再按第一列的字母順序的逆序排序 (-r)
# 注意看前3行的順序與上一步結果的差異
ct@ehbio:~$ sort test2 | uniq -c | awk 'BEGIN{OFS="\t";}{print $2,$1}' | sort -k2,2n -k1,1r
e   1
d   1
c   1
b   2
a   3

FASTA序列提取

生成單行序列FASTA文件,提取特定基因的序列剖毯,最簡單的是使用grep命令圾笨。

grep在前面也提到過,以后還會經(jīng)常提到逊谋,主要用途是匹配文件中的字符串擂达,以此為基礎,進行一系列的操作涣狗。如果會使用正則表達式舒憾,將會非常強大镀迂。正則表達式版本很多,幾乎每種語言都有自己的規(guī)則探遵,本文檔不會展開窟赏,用到哪個提哪個。

# 生成單行序列FASTA文件
ct@ehbio:~$ cat <<END >test.fasta
> >SOX2
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> >POU5F1
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> >NANOG
> CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT
> END
ct@ehbio:~$ cat test.fasta 
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
>POU5F1
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
>NANOG
CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT

# grep匹配含有SOX2的行
# -A 1 表示輸出的行中赚瘦,包含匹配行的下一行 (A: after)
ct@ehbio:~$ grep -A 1 'SOX2' test.fasta 
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC

# 也可以使用AWK
# 先判斷當前行是不是 > 開頭套菜,如果是,表示是序列名字行,替換掉大于號斑胜,取出名字控淡。
# sub 替換, sub(被替換的部分,要替換成的止潘,待替換字符串)
# 如果不以大于號開頭掺炭,則為序列行,存儲起來凭戴。
# seq[name]: 相當于建一個字典涧狮,name為key,序列為值么夫。然后就可以使用name調(diào)取序列者冤。
ct@ehbio:~$ awk 'BEGIN{OFS=FS="\t"}{if($0~/>/) {name=$0; sub(">", "", name);} else seq[name]=$0;}END{print ">SOX2"; print seq["SOX2"]}' test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC

多行FASTA序列提取要麻煩些,一個辦法就是轉(zhuǎn)成單行序列档痪,用上面的方式處理涉枫。

sedtr都為最常用的字符替換工具。

ct@ehbio:~$ cat <<END >test.fasta
> >SOX2
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> ACGAGGGACGCATCGGACGACTGCAGGAC
> >POU5F1
> CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT
> CGGAAGGTAGTCGTCAGTGCAGCGAGTCC
> >NANOG
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> ACGAGGGACGCATCGGACGACTGCAGG
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> ACGAGGGACGCATCGGACGACTGCAGGACTGT
> END

# 給>號開頭的行的行尾加個TAB鍵腐螟,以便隔開名字和序列
# TAB鍵不可見拜银,直接看看不大
# \(\)表示記錄匹配的內(nèi)容,\1則表示()中記錄的匹配的內(nèi)容
# 后面我們專門講sed
ct@ehbio:~$ sed 's/^\(>.*\)/\1\t/' test.fasta 
>SOX2   
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGGAC
>POU5F1 
CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT
CGGAAGGTAGTCGTCAGTGCAGCGAGTCC
>NANOG  
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGG
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGGACTGT

#使用cat -A 可以顯示文件中所有的符號
# ^I 表示tab鍵
# $表示行尾

ct@ehbio:~$ sed 's/^\(>.*\)/\1\t/' test.fasta | cat -A
>SOX2^I$
ACGAGGGACGCATCGGACGACTGCAGGACTGTC$
ACGAGGGACGCATCGGACGACTGCAGGACTGTC$
ACGAGGGACGCATCGGACGACTGCAGGAC$
>POU5F1^I$
CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT$
CGGAAGGTAGTCGTCAGTGCAGCGAGTCC$
>NANOG^I$
ACGAGGGACGCATCGGACGACTGCAGGACTGTC$
ACGAGGGACGCATCGGACGACTGCAGG$
ACGAGGGACGCATCGGACGACTGCAGGACTGTC$
ACGAGGGACGCATCGGACGACTGCAGGACTGT$

# 把所有的換行符替換為空格
# tr這個命令遭垛,前面提到過尼桶,若想不起來 `man tr`查看
# 主意第二個參數(shù),引號內(nèi)為空格锯仪。
ct@ehbio:~$ sed 's/^\(>.*\)/\1\t/' test.fasta | tr '\n' ' '
>SOX2    ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGAC >POU5F1   CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT CGGAAGGTAGTCGTCAGTGCAGCGAGTCC >NANOG    ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGG ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGT 

# 把最后一個空格替換為換行符
ct@ehbio:~$ sed 's/^\(>.*\)/\1\t/' test.fasta | tr '\n' ' ' | sed -e 's/ $/\n/'
>SOX2    ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGAC >POU5F1   CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT CGGAAGGTAGTCGTCAGTGCAGCGAGTCC >NANOG    ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGG ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGT

# 把  ' >'替換為換行符 注意被替換的是 空格+大于號
# 當連用多個替換命令時泵督,使用-e 隔開
ct@ehbio:~$ sed 's/^\(>.*\)/\1\t/' test.fasta | tr '\n' ' ' | sed -e 's/ $/\n/' -e 's/ >/\n>/g'
>SOX2    ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGAC
>POU5F1  CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT CGGAAGGTAGTCGTCAGTGCAGCGAGTCC
>NANOG   ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGG ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGT

# 把所有的空格替換掉
ct@ehbio:~$ sed 's/^\(>.*\)/\1\t/' test.fasta | tr '\n' ' ' | sed -e 's/ $/\n/' -e 's/ >/\n>/g' -e 's/ //g'
>SOX2   ACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGAC
>POU5F1 CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGTCGGAAGGTAGTCGTCAGTGCAGCGAGTCC
>NANOG  ACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACTGT

# 把TAB鍵轉(zhuǎn)換為換行符
ct@ehbio:~$ sed 's/^\(>.*\)/\1\t/' test.fasta | tr '\n' ' ' | sed -e 's/ $/\n/' -e 's/ >/\n>/g' -e 's/ //g' -e 's/\t/\n/g' 
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGAC
>POU5F1
CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGTCGGAAGGTAGTCGTCAGTGCAGCGAGTCC
>NANOG
ACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACTGT

或者簡單點,直接用前面的awk略微做下修改庶喜。

# 差別只在一點
# 對于單行fasta文件小腊,只需要記錄一行,seq[name]=$0
# 對于多好fasta文件久窟,需要把每一行序列都加到前面的序列上秩冈,seq[name]=seq[name]$0
ct@ehbio:~$ awk 'BEGIN{OFS=FS="\t"}{if($0~/>/) {name=$0; sub(">", "", name);} else seq[name]=seq[name]$0;}END{print ">SOX2"; print seq["SOX2"]}' test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGAC

命令運行監(jiān)測

  1. 檢測命令的運行時間 time command
ct@ehbio:~$ time sleep 5

real    0m5.003s # 程序開始至結束的時間,包括其它進程占用的時間片和IO時間
user    0m0.001s # 進程真正執(zhí)行占用CPU的時間, 
sys 0m0.002s     # 進程在內(nèi)核中調(diào)用所消耗的CPU時間
user+sys是進程實際的CPU時間斥扛。如果多線程執(zhí)行入问,這個時間可能大于Real。如果IO是瓶頸,則real會大于user+sys (單線程)芬失。

  1. 查看正在運行的命令和其資源使用 top
  • top輸出界面第一行主要信息是負載顯示楣黍,分別是1分鐘、5分鐘棱烂、15分鐘前到現(xiàn)在的任務隊列的平均長度租漂。
  • 一般與CPU數(shù)目相當為好,過大系統(tǒng)負載超額颊糜,反應慢哩治。
  • 在top輸出界面輸入 u, 會提示輸入用戶名,以查看某個用戶的進程衬鱼。
  • 重點關注的是%MEM列业筏,查看系統(tǒng)占用的內(nèi)存是否超出。
ct@ehbio:~$ top -a #按內(nèi)存排序顯示

top - 09:02:11 up 224 days,  8:34,  30 users,  load average: 40, 33, 28
Tasks: 1561 total,   1 running, 1550 sleeping,   0 stopped,  10 zombie
Cpu(s):  0.6%us,  0.2%sy,  0.0%ni, 99.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  2642768880k total, 2094619800k used, 548149080k free,   4310240k buffers
Swap: 86472700k total, 73226016k used, 13246684k free, 193383748k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                  
32527 ct        20   0 2631m 1.7g 1332 S  0.0  0.7 100:34.87 rsem-run-em 
29273 ct        20   0 4094m 692m 3396 S  0.0  0.3  45:18.83 java -Xmx1000m
40148 mysql     20   0 21.9g 606m 6116 S  1.3  0.2   2536:06 /usr/sbin/mysqld
31040 ct        20   0 1887m  77m 2604 S  0.3  0.0 180:43.16 [celeryd: 

  1. 查看系統(tǒng)進程 ps auwx | grep 'process_name'

文件系統(tǒng)和磁盤信息監(jiān)測

查看系統(tǒng)硬盤大小和分配

ct@ehbio:~$ df -h
Filesystem            Size  Used   Avail   Use% Mounted on
/dev/sda3             193G  112G     71G    62% /
tmpfs                 127G  104K    127G     1% /dev/shm
/dev/sda2             477M  102M    351M    23% /boot
/dev/sda1             200M  264K    200M     1% /boot/efi
/dev/mapper/ehbiobp1  137T   10T    127T     7% /ehbioB
/dev/mapper/ehbiocp1  137T   32T  104.8T    23% /ehbioC
/dev/mapper/ehbiodp1  137T   56T     81T    41% /ehbioD

ct@ehbio:~$ du -sh *
268M    blog
4.0K    browserMimic.py
5.6G    CAFE
386M    chip
73M class
4.0K    config.file
4.0K    do_not_del_r_test.Rmd
7.2M    ehbio
20K ehbio_logo.png
12K ehbio_weixin.jpg
4.0K    Grid_with_line.Rmd
8.0K    heatmap_nonlinear.pdf
8.0K    heatmap_nooutlier.pdf

軟件安裝

不同于windows馁启,Linux下軟件安裝的方式比較多樣驾孔,有些也比較復雜芍秆。每種安裝方式都有自己的優(yōu)點和局限惯疙,也都有可能遇到問題。在我們理解了原理之后妖啥,借助谷歌霉颠,可以更好地幫助解決問題。

系統(tǒng)包管理器安裝

軟件安裝最方便的荆虱、一般也不容易出問題的是利用系統(tǒng)自帶的包管理工具蒿偎,可以解決大部分的依賴問題。

# centos
# 如果長時間沒更新怀读,先運行下update
yum update
# 如果不知道軟件具體名字诉位,可以先用一個關鍵字search一下, 選擇正式的名字
# 需要注意的是一般的服務器都是64 bit,需要選x86_64版本
yum search soft_name or soft_description
yum search soft_official_name

但也有一些不足菜枷,主要3點:

  1. 需要根用戶的權限苍糠。
  2. 如果系統(tǒng)版本老,安裝的軟件版本也會比較老啤誊。使用新版本有時又會發(fā)生沖突岳瞭。
  3. 生物信息學中不少軟件不在系統(tǒng)的安裝源里面。

解決這些問題蚊锹,就需要自己去軟件官網(wǎng)查找最新的分法包瞳筏,又有兩種可能,一種是分法包直接就是編譯好的軟件牡昆,下載下來設置下可執(zhí)行屬性并放入環(huán)境變量就可以運行了姚炕,如于blastbowtie這樣的工具。

另一種則是需要從源碼編譯安裝,下面主要講解下這個钻心。

源碼編譯安裝

源碼編譯經(jīng)典的三部曲configure, make, make install凄硼。如果不出問題,對著執(zhí)行下來就安裝好了捷沸,也不一定知其所以然摊沉。但出了問題,就不是比較容易解決的痒给。如果知道這背后的機制说墨,還是會有幫助的。

  • configure是檢查系統(tǒng)的庫文件苍柏、類文件尼斧、依賴軟件是否存在以及它們的版本是否滿族需求,并根據(jù)實際檢測結果生成Makefile的工具试吁。一般是一堆bash命令的組合棺棵。通常也需要在這一步配置一些參數(shù)。最常用的就是指定軟件的安裝目錄--prefix=/home/ct/soft/specific_name熄捍。

  • make則是具體的編譯過程烛恤。編譯的語句都寫在了Makefile中。make默認編譯Makefile中出現(xiàn)的第一個target余耽,也可以指定target編譯缚柏,并根據(jù)Makefile的設置方式依次編譯所有依賴的東西。

    Makefile通常的格式和布局如下碟贾,有興趣的可以自己去學币喧,或者我們再出一個教程。

    # 假設當前文件夾下Makefile文件中內(nèi)容如下 
    ct@ehbio:~$ cat Makefile
    # first: target名字
    # echo "compile first": target對應的命令袱耽,任何Linux命令都可以
    first:
        echo "compile first"
    all: first second
        echo "compile all"
    second:
        echo "compile second"
    
    # 直接運行make杀餐,會make第一個出現(xiàn)的target
    ct@ehbio:~$ make
    echo "compile first"
    compile first
    # make first與直接make相同,因為它出現(xiàn)在第一個 
    ct@ehbio:~$ make first
    echo "compile first"
    compile first
    # all依賴于first, second朱巨,因此make all會先執(zhí)行make first, make second
    # 然后才是自己所代表的命令 
    ct@ehbio:~$ make all
    echo "compile first"
    compile first
    echo "compile second"
    compile second
    echo "compile all"
    compile all
    
    

有些軟件的安裝史翘,在執(zhí)行完make后就獲得了可執(zhí)行程序,可以跳過make install的過程蔬崩,只需要放入環(huán)境變量就可以運行了恶座。但部分軟件還需要一些依賴關系,所以需要執(zhí)行make install才算完成了完整的安裝沥阳。

  • make install通常是拷貝make編譯出來的可執(zhí)行文件或者依賴的庫文件(如果有的話)到configure時的--prefix指定的目錄下跨琳。

  • 安裝好的軟件放入環(huán)境變量, 就可以快樂的運行了。

兩條注意:

  • 從源碼編譯最難解決的問題就是依賴的庫文件桐罕、頭文件脉让、其它軟件的缺失或版本不匹配桂敛,沒有統(tǒng)一的解決辦法,原則就是缺啥補啥溅潜。

  • 三部曲每一步的執(zhí)行术唬,屏幕上都會輸出比較多的信息,一定仔細看最后有沒有ERROR類的字樣滚澜,對判斷軟件有無安裝成功和下一步要怎么做會很有幫助粗仓。

Linux包的安裝的通用方式主要這些,后面還會提到兩種虛擬安裝方式设捐,也都是為了簡化安裝而提出的借浊。

Python包的安裝

在沒有Anaconda(或其前身canopy)出現(xiàn)之前,Python包以其管理混亂萝招、安裝困難著稱蚂斤。有了Anaconda后,不只python包的安裝簡單了槐沼,其它軟件的安裝也都方便了 (詳見后面Anaconda的兩個福利)曙蒸。

  • 首先下載Anaconda的安裝包 https://www.continuum.io/downloads
  • Anaconda的安裝包做的很人性化岗钩,一個bash腳本纽窟,只要運行bash Anacond*x86_64.sh,然后按照提示操作就可以了凹嘲。
  • 按照好后师倔,設置或刷新下環(huán)境變量就可以使用了构韵。
  • 此后再安裝python的包只需要執(zhí)行pip install pakcage_nameconda install pakckage_name就可以了周蹭。
  • 這里唯一需要注意的就是確認使用的pythonpip確實是Anaconda安裝的pythonpip
    • which python查看使用的python命令疲恢。
    • 如果使用的還是系統(tǒng)默認的python凶朗,則需要檢查下環(huán)境變量的設置。

Anaconda的兩個福利

  1. 頭文件和庫文件庫

這是Anaconda安裝后的目錄結構

bin   envs  Examples  imports  lib    LICENSE.txt  pkgs     share  var
conda-meta  etc   gcc include  lib64  mkspecsplugins  ssl

其中l(wèi)ib目錄下显拳,一部分是依賴的動態(tài)鏈接庫, .so文件棚愤;這也是在源碼編譯時最常見的攔路虎。通常杂数,只需要把這個目錄放入環(huán)境變量LD_LIBRARY_PATH里面比如export LD_LIBARY_PATH=${LD_LIBARY_PATH}:anaconda_path/lib就可以解決問題宛畦。

cairo                    libitm.a              libQtScript.so.4
cmake                    libitm.la             libQtScript.so.4.8
engines                  libitm.so             libQtScript.so.4.8.7
gcc                      libitm.so.1           libQtScriptTools.la
gcj-4.8.5-14             libitm.so.1.0.0       libQtScriptTools.prl
glib-2.0                 libitm.spec           libQtScriptTools.so
libargtable2.a           libjpeg.a             libQtScriptTools.so.4
libargtable2.la          libjpeg.la            libQtScriptTools.so.4.8
libargtable2.so          libjpeg.so            libQtScriptTools.so.4.8.7
libargtable2.so.0        libjpeg.so.8          libQtSql.la
libargtable2.so.0.1.8    libjpeg.so.8.4.0      libQtSql.prl
libasan.a                libmkl_avx2.so        libQtSql.so
libasan.la               libmkl_avx512_mic.so  libQtSql.so.4
libasan_preinit.o        libmkl_avx512.so      libQtSql.so.4.8
libasan.so               libmkl_avx.so         libQtSql.so.4.8.7

  1. bioconda

bioconda提供了一個虛擬環(huán)境,方便軟件的編譯安裝揍移。具體的我沒用過次和,可以讀下 徐洲更的生信軟件的好幫手-bioconda。

R包的安裝

R包的安裝具體看之前的R教程那伐。

需要注意的也是依賴的軟件或庫文件的版本踏施,同樣的Anaconda提供的lib庫也可以直接拿來用石蔗。

備注

文中凡是提到環(huán)境變量的地方都可鏈接到之前提到的環(huán)境變量使用的文章,請務必仔細讀兩遍畅形。

如果軟件版本或依賴實在解決不了的养距,用Docker,虛擬出一個新的系統(tǒng)來解決日熬,具體見棍厌。

Original link

原文鏈接 http://blog.genesino.com//2017/06/bash1/

微信公眾號

http://mp.weixin.qq.com/s/yKP1Kboji9N4p2Sl1Ovj0Q

AIRFLOWPYTHONCHENTONG
版權聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請注明出處竖席。

alipay.png
WeChatPay.png

</footer>

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末定铜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子怕敬,更是在濱河造成了極大的恐慌揣炕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件东跪,死亡現(xiàn)場離奇詭異畸陡,居然都是意外死亡,警方通過查閱死者的電腦和手機虽填,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門丁恭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斋日,你說我怎么就攤上這事牲览。” “怎么了恶守?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵第献,是天一觀的道長。 經(jīng)常有香客問我兔港,道長庸毫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任衫樊,我火速辦了婚禮飒赃,結果婚禮上,老公的妹妹穿的比我還像新娘科侈。我一直安慰自己载佳,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布臀栈。 她就那樣靜靜地躺著蔫慧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挂脑。 梳的紋絲不亂的頭發(fā)上藕漱,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天欲侮,我揣著相機與錄音,去河邊找鬼肋联。 笑死威蕉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的橄仍。 我是一名探鬼主播韧涨,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侮繁!你這毒婦竟也來了虑粥?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宪哩,失蹤者是張志新(化名)和其女友劉穎娩贷,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锁孟,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡彬祖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了品抽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片储笑。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖圆恤,靈堂內(nèi)的尸體忽然破棺而出突倍,到底是詐尸還是另有隱情,我是刑警寧澤盆昙,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布羽历,位于F島的核電站,受9級特大地震影響弱左,放射性物質(zhì)發(fā)生泄漏窄陡。R本人自食惡果不足惜炕淮,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一拆火、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涂圆,春花似錦们镜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至踩衩,卻和暖如春嚼鹉,著一層夾襖步出監(jiān)牢的瞬間贩汉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工锚赤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匹舞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓线脚,卻偏偏與公主長得像赐稽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浑侥,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言伶选,發(fā)作 oo-boon-too 的音躏将。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,269評論 9 467
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,167評論 2 33
  • 下面是 騰訊云實驗室的教程, 方便自己練習和記錄這些命令考蕾,整合自己感興趣的三個教程收集在這里祸憋。 1 Linux基礎...
    Dino閱讀 996評論 0 50
  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多,請查閱幫助信息) 1肖卧、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,097評論 1 19
  • 昨夜看見路燈下面人影密集簇群塞帐,而我卻散漫孤只拦赠。 眼淚蹣跚不下,后知后覺地了解到——生命里的陪伴不是長久便是一瞬葵姥。然...
    寧永顧閱讀 287評論 0 0