专栏首页生信宝典Linux学习 - 管道、标准输入输出

Linux学习 - 管道、标准输入输出

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.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: 是用于替换字符的,把空格替换为换行,文字就从一行变为了一列
ct@ehbio:~$ echo "1 2 3" | tr ' ' '\n'
1
2
3

# cat命令之前也用过,输出一段文字
# diff是比较2个文件的差异的,需要2个参数
# - (短横线)表示上一个命令的输出,传递给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 =:先输出行号,再输出每行的内容
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: 替换;把读取的奇数行行首加一个'>'(偶数行相当于被隐藏了)
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

本文分享自微信公众号 - 生信宝典(Bio_data),作者:陈同

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-06-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux学习-文件列太多,很难识别想要的信息在哪列;别焦急,看这里。

    经常会碰到列数特别多的文件,而屏幕又不足以放下这么多列;即便能放下,也不容易清晰的辨别出想提取的信息在第几列。 根据我们前面的学习,可以用一行命令或简单的写一...

    生信宝典
  • Linux学习-环境变量和可执行属性

    文件的可执行属性和环境变量 Linux下文件有一个特殊的属性即可执行属性,用来指示这个文件是一个可执行的脚本或可以运行的二进制文件。前面所提到的这些命令,都具有...

    生信宝典
  • 来一份Python学习题

    3*2**2的输出是多少?(1分) 8 % 4的输出是多少?(1分) 32 + '32'的输出是什么?(1分) 32 > '32'的输出是什么?(1分) 'Sh...

    生信宝典
  • 手风琴图片和钢琴导航栏JQ滑动特效

    Dream城堡
  • 【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第七节)

    剽悍一小兔
  • CSS 特征布局实例 - 导航栏、新闻列表、淘宝布局

    重点:这里不能使用float:left的方式,因为这种方式不方便于居中。如果使用偏移的方式居中,当页数增加的时候,可能就不居中了。

    Devops海洋的渔夫
  • 看用友王文京、太极刘淮松、东华吕波、超图宋关福谈以往的过失

    访谈嘉宾:用友董事长王文京、太极总裁刘淮松、东华软件总经理吕波、超图软件总裁宋关福。 上周我们发表了《软件行业的十字路口看用友、太极、东华、超图各位老总如何谈...

    人称T客
  • 成功项目管理的七条原则和三十个秘诀

    美国著名软件工程专家勃姆(B.W.Boehm)在总结软件工程准则和信条的基础上,于1983年提出软件…

    白凡
  • 肿瘤浸润免疫细胞量化分析简介

    肿瘤微环境是肿瘤细胞生存和发展的土壤,其中浸润到肿瘤局部的免疫细胞介导了肿瘤免疫微环境,tumor immune microenvironment, 简称TIM...

    生信修炼手册
  • Spark No FileSystem for scheme file 解决方法

    这里的 Local repository 就是项目保存库的位置。在这里面依次打开文件位置:

    机器学习和大数据挖掘

扫码关注云+社区

领取腾讯云代金券