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
网友评论