Linux学习生物信息学与算法

生物信息 Linux学习3

2017-08-02  本文已影响16人  生信宝典

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

Linux下命令的一些异常情况

命令不全:在命令没有输入完(引号或括号没有配对),就不小心按下了Enter键,终端会提示出一个>代表命令不完整,这是可以继续输入,也可以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.faehbio3.faehbio4.faehbio.fasecond.fa
#重命名没有生效
ct@ehbio:~/ehbio_project$ rename 'ehbio2''ehbio5' ebio2.fa
ct@ehbio:~/ehbio_project$ ls
ehbio2.faehbio3.faehbio4.faehbio.fasecond.fa
#仔细看是ehbio2.fa写成了ebio2.fa,更正后即可。
Z8vb3e9jtel4m99ss6e7eZ:~/ehbio_project$rename 'ehbio2' 'ehbio5' ehbio2.fa
ct@ehbio:~/ehbio_project$ ls
ehbio3.faehbio4.faehbio5.faehbio.fasecond.fa

所在目录不对:访问的文件不存在于当前目录,而又没有提供绝对路径,或软连接失效

ct@ehbio:~/ehbio_project$ ls
ehbio3.faehbio4.faehbio5.faehbio6.faehbio.fasecond.fa
ct@ehbio:~/ehbio_project$ ls ../data
ehbio2.fafirst.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下文件内容操作

常用的文件内容操作有文件压缩解压缩、文件大小行数统计、文件内容查询等。
gzip:压缩文件;
gunzip:解压缩文件

# gzip -c把压缩的文件输出到标准输出(一般是屏幕)
# '>'输出重定向,输出写入文件
ct@ehbio:~/ehbio_project$ gzip -c ehbio.fa>ehbio.fa.gz
#多了一个.gz文件
ct@ehbio:~/ehbio_project$ ls
ehbio3.faehbio4.faehbio5.faehbio.faehbio.fa.gzsecond.fa
#解压缩
ct@ehbio:~/ehbio_project$ gunzipehbio.fa.gz
gzip: ehbio.fa already exists; do you wishto overwrite (y or n)? y
ct@ehbio:~/ehbio_project$ ls
ehbio3.faehbio4.faehbio5.faehbio.fasecond.fa

wc (word count):一般使用wc -l获取文件的行数

#输出文件有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
#获取包含>的行的行数(-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是一个功能强大的文件内容编辑工具,常用于替换、取得行号等操作。

#第一个错误,漏掉了文件名
#程序静止在这,等待用户的进一步输入
# 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键,系统会自动补全或提示补全 上下箭头:使用上下箭头可以回溯之前的命令,增加命令的重用,减少输入工作量

  • !加之前输入过的命令的前几个字母,快速获取前面的命令
    ct@ehbio:~/ehbio_project$ cut -f 1 -d ' 'ehbio.fa | tail -n 4
    >mYC
    ACGGAGCGAGCTAGTGCAGCGAGGAGCTGAGTCGAGC
    CAGGACAGGAGCTA
    end
    ct@ehbio:~/ehbio_project$ man cut
    #直接跳到上面运行的cut命令,再执行一次
    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.faehbio4.faehbio5.faehbio6.faehbio.fasecond.fa
    ct@ehbio:~/ehbio_project$ !!
    ls
    ehbio3.faehbio4.faehbio5.faehbio6.faehbio.fasecond.fa
    
    *替换上一个命令中的字符,再运行一遍命令,用于需要对多个文件执行同样的命令,又不想写循环的情况
    #输入一个命令
    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系统中,有4个特殊的符号,<, ‘>’, ‘|’, ‘-‘,在我们处理输入和输出时存在重要但具有迷惑性的作用。
    默认Linux的命令的结果都是输出到标准输出,错误信息(比如命令未找到或文件格式识别错误等)输出到标准错误,而标准输出和标准错误默认都会显示到屏幕上。
    >表示重定向标准输出,> filename就是把标准输出存储到文件filename里面。标准错误还是会显示在屏幕上。
    2 >&1表示把标准错误重定向到标准输出。Linux终端用2表示标准错误,1表示标准输出。
    - (短横线):表示标准输入,一般用于1个程序需要多个输入的时候。
    <标准输入,后面可以跟可以产生输出的命令,一般用于1个程序需要多个输入的时候。
    |管道符,表示把前一个命令的输出作为后一个命令的输入,前面也有一些展示例子。用于数据在不同的命令之间传输,用途是减少硬盘存取损耗。
    下面我们通过一个程序stdout_error.sh来解释上面的文字,内容如下
    #!/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.stdout2>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:是用于替换字符的,把空格替换为换行,文字就从一行变为了一列
    ct@ehbio:~$ echo "1 2 3" | tr ' ''\n'
    1
    2
    3
    # cat命令之前也用过,输出一段文字
    # diff是比较2个文件的差异的,需要2个参数
    # - (短横线)表示上一个命令的输出,传递给diff
    # <表示其后的命令的输出,也重定向给diff
    ct@ehbio:~$ cat <
    > 2
    > 3
    > 4
    > END
    0a1
    > 1
    3d3
    < 4
    #如果不使用管道和重定向标准输入,程序是这么写的
    #先把第一部分存储为1个文件
    ct@ehbio:~$ cat <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 =:先输出行号,再输出每行的内容
    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/'
    1a
    2b
    3c
    #后面这个命令不太好解释
    # sed =同时输出行号
    # N:表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
    # s:替换;把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
    ct@ehbio:~$ echo"a b c" | tr ' ' '\n' | sed = | sed'N;s/^/>/'
    >1
    a
    >2
    b
    >3
    c
    #把多条序列转成FATSA格式
    # sed =同时输出行号
    # N:表示读入下一行;sed命令每次只读一行,加上N之后就是缓存了第2行,所有的操作都针对第一行;
    # s:替换;把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
    #于是FASTA格式序列就出来了
    ct@ehbio:~$ echo"actg aaaaa cccccg" | tr ' ' '\n' |sed = | sed 'N;s/^/>/'
    >1
    actg
    >2
    aaaaa
    >3
    cccccg
    
  • 上一篇下一篇

    猜你喜欢

    热点阅读