“ 在Linux系统里,有着两个神奇的概念,学了这两个概念,你才是真正的开始领会Linux的精妙之处,体会到Linux的精髓部分。”
老规矩,第一步还是先给出上节课的习题答案
# 在家里建立test文件夹
cd ~
mkdir test
# 在test文件夹建立文本文件 t1 t2 t3 并且复制/etc/fstab过来
cd test
touch t1 t2 t3
cp /etc/fstab .
# 压缩t1 t2 t3为bz2
bzip2 t1 t2 t3
# 压缩fstab为gz并且保留原始文件
gzip -c fstab > f.gz
# 打包test目录为一个.tar.gz
tar cvfz test.tar.gz test
# 删除原始目录
rm -rf test
# 解压test文件夹
tar xvfz test.tar.gz
# 解压fstab
gunzip f.gz
# 解压包含t1t2t3的bz2文件
bunzip2 t*
过去的课程里,我们已经基本上掌握了Linux的黑框框里的基本操作了,可以像windows一样查看目录和文件,创建修改目录和文件甚至更加优雅的查看文件内容;我们还学会了复制,移动和删除文件(目录);后面还学习到了更复杂的下载命令和解压命令。
但是我们这些好像在Windows下都可以做到,在Linux下难道就没有什么比较强大的和Windows不同的命令操作吗?那当然了,今天就来讲讲Linux最最神奇的两个概念,管道和重定向。
改变标准输入 - <
由于大家都非常缺乏计算机系统的理论知识,所以管道这里就不讲解其具体实现的思想,我们把重点放在管道的概念以及其使用。相信这也是大多数看这套教程的人的目的,毕竟大家不是linux开发者,大部分都是用来处理数据而已。
说起管道,首先得谈一谈过去隐约提到的这两个东西,标准输入和标准输出。我们linux系统的很多程序,都是有着一个共同的原则,从标准输入中读取,然后经过处理后,进行标准输出。
什么意思呢,给一个最经典的命令,cat,大家尝试这样 在终端中直接输入cat,我们会发现shell好像死了一样,什么也不做,但是你输入了随便一句话,然后回车,cat就会重复你这句话,然后直到你ctrl+D终止了它,就又退回到了命令行。
$ cat
I like apple
I like apple
I want to get a ball
I want to get a ball
Hello
Hello
cat ?
cat ?
# ctrl + D
通过这个例子,我们能了解到,标准输入一般来说就是你的键盘输入,标准输出就是你的控制台给你输出的内容。
我们再来看一个例子,在linux中,我们常常使用wc -l来统计一个文件的行数。那么,我们现在来做类似上面的操作
$ wc -l
2
5
666
I like pea
???
answer me,wc?
# 我们发现wc -l没有任何反应 是wc程序出问题了吗?
# ctrl + D
6
# 获得标准输出
我们终止了标准输入以后,wc -l开始给我们统计行数,然后统计结束,标准输出。
通过上面的案例,相信大家已经非常了解什么叫标准输入和标准输出了吧!下面开始正式的讲解我们的新概念,输入重定向。
重定向,我对于这个词的理解是重新指定方向,这里的方向不是我们说的东西南北,是指给linux指定一个输出或者输出的方向来源。
这样,输入重定向的概念就来了,给定linux命令一个输入来源来取代标准输入,对输入来源进行处理,然后输出到标准输出,输入重定向的符号是我们的小于号 < ,下面给出一个案例。
假设我这里有抽取了不知道多少行的人类基因组的注释文件
# 上述文件名为 test
# 下面把test文件重定向给cat
cat < test
我们看到的输出结果和cat test好像没有什么区别,那是因为cat本来就是读取标准输入然后输出,这个把标准输入变成了test文件而已,下面看一个wc的案例,大家就能看到问题所在了。
# wc -l test
# wc -l < test
看到不同点了吗?再想想上面的只进行了wc -l期待标准输入的操作,再看看这里的第二个使用了标准输入重定向的操作,相信你一定已经理解了什么叫标准输入重定向。
改变标准输出 - >
如果上文的标准输入重定向你已经透彻的理解了,那么标准输出重定向你应该马上就知道它的概念了。
输出重定向的概念也来了,给定linux命令一个输出文件名,它就会自动的把标准输出重定向到你指定的文件里,这就是输出重定向。输出重定向的符号是>号。
我们平时对输入重定向的使用并不是很多,因为大部分操作都是通过管道进行的,不需要你去调整输入。但是对于输出重定向的使用非常多,比如你获得了一个样本文件,想拿出前十行看看,然后你就得保存,你总不能head -n 10以后自己复制然后粘贴到vim里吧。还有很多程序的运行结果,我们都需要把中间的输出放进一个log文件中,方便我们后续进行查看。
话不多说,大家用到的时候自然就会想到进行重定向了,下面给个案例
# 从基因组注释文件抽出每条染色体的长度
grep sequence-reg gencode.v38.annotation.gff3
# 但是我们想把结果保存在文件 chr.len中
grep sequence-reg gencode.v38.annotation.gff3 > chr.len
cat chr.len
一目了然,这就是输出重定向的操作方法和使用。大家是不是已经懂了呢?
管道 - |
其实我们的重定向操作不仅仅只有 < 和 >,但是由于篇幅有限,后面的高级教程中会再次讲解余下的重定向操作,不过目前的这两个已经够你一大部分操作使用了。
下面在文章的最后,我们来讲解一下管道操作。这个管道简直形象的不能再形象了,大家可以想象有一根长长管子,从一端放进了原材料(标准输入或者输入),然后被处理,然后沿着管子继续流,又遇到了一个工作区进行处理,然后又在管子里流,。。。,直到流到了管子的另一端,流了出来(标准输出),或者流进了一个容器里(输出重定向)。这就是管道,我这么通俗的解释,大家应该已经懂了90%,下面给大家整个案例。
# 还是刚刚的文件处理操作
# 我们现在变成从原始注释文件中
# 抽取染色体长度行
# 提取长度和染色体名字
# 保存到文件chr1.len中
grep sequence-reg gencode.v38.annotation.gff3 | cut -d ' ' -f 2,4 > chr1.len
cat chr1.len
这就是管道,是不是非常的丝滑,非常的流畅,我再给大家做个简单案例。
# 注释文件中的前一百行出现了多少次gene、
head -n 100 gencode.v38.annotation.gff3 | grep '\sgene\s' | wc -l
超级有用的思想,大家后面自己进行linux操作和数据处理的时候,一定要想到使用管道啊!真的是必备技能,必须懂,这两个概念是linux的应用中,非常非常非常重要的东西,还需要在使用中多多的体会才能更好的理解。
此外,其实很多流程工具或者流程语言也是这种思想,nextflow 和 snakemake以及其他的较为小众的流程语言都是这个思想。所以大家还是,一定要懂得这两个概念,并且要有自己的理解。
今天的分享就到这里了,下一次的分享将为大家详细讲解关于通配符在日常操作中的使用,以及使用ln建立软连接的操作*。
如果你喜欢我的文章,请收藏我的文章并且给我个赞,你的支持就是我更新的最大的动力,关注我会有更多惊喜哦,专注于生物信息学以及数据分析入门和进阶教程,也许我给不了你从10-100,但是我可以给你最好的从0-10!
最后,关注我的公众号,领取更多学习资料吧!!!
打开v搜索,”轻松玩转生信“或者从下面文章进去获取二维码关注哦