当前位置: 首页 > news >正文

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

运行这个脚本:

# 标准输出和标准错误默认都会显示到屏幕上
$ bash stdout_error.sh 
I am std output
stdout_error.sh: line 5: unexisted_command: command not found


# >把结果输入到了文件;标准错误还显示在屏幕上
$ bash stdout_error.sh > stdout_error.stdout
stdout_error.sh: line 5: unexisted_command: command not found
$ cat stdout_error.stdout
I am std output


# > 把结果输入到了文件; 2> 把标准错误输入到了另一个文件
$ bash stdout_error.sh > stdout_error.stdout 2> stdout_error.stderr
$ cat stdout_error.stderr
stdout_error.sh: line 5: unexisted_command: command not found


# 标准输出和标准错误写入同一个文件
$ bash stdout_error.sh > stdout_error.stdout 2>&1
$ cat stdout_error.stdout
I am std output
stdout_error.sh: line 5: unexisted_command: command not found

下面看管道符和标准输入的使用:

# 管道符的使用
# 第一个命令的输出作为第二个的输入
# 前面的例子中也有使用
# tr: 是用于替换字符的,把空格替换为换行,文字就从一行变为了一列
$ echo "1 2 3" | tr ' ' '\n'
1
2
3


# cat命令之前也用过,输出一段文字
# diff是比较2个文件的差异的,需要2个参数
# - (短横线)表示上一个命令的输出,传递给diff
# < 表示其后的命令的输出,也重定向给diff
$ cat <<END | diff - <(echo "1 2 3" | tr ' ' '\n')
> 2
> 3
> 4
> END
0a1
> 1
3d3
< 4


# 如果不使用管道和重定向标准输入,程序是这么写的
# 先把第一部分存储为1个文件
$ cat <<END >firstfile
2
3
> 4
> END
$ less firstfile 

# 再把第二部分存储为1个文件
$ echo "1 2 3" | tr ' ' '\n' >secondfile

# 然后比较
$ diff firstfile secondfile 
0a1
> 1
3d3
< 4

管道符的更多应用:

$ 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
$ 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

相关文章:

  • 训练yolo系列+deepsort模式的跟踪器(一):训练deepsort
  • 常见的DDoS攻击方式和预防方法
  • Python基础之:Python中的模块
  • CSS -- 10. 移动WEB开发之rem布局
  • 2022年第三届MathorCup高校数学建模挑战赛——大数据竞赛 赛道B 北京移动用户体验影响因素研究 问题二建模方案及代码实现详解
  • 测试人不得不知的 HTTP 状态码知识
  • 【十分钟学懂Linux操作系统】
  • 【Java基础知识复盘】Java概述篇
  • Stm32标准库函数6——f103 PWM 电调(50Hz)
  • 不喜欢现在的工作,如何成功转行?
  • 腾讯天美Java程序员月均20万!掌握这个后,也太香了....
  • 网络ping不通,试试这8招
  • 密码改造技术路径大比拼--“免”改造太理想,“重”改造太复杂,“易”改造是王道
  • Docker镜像的原理
  • APS排产帮助面板制造厂商进行计划调整
  • C学习-枚举(九)
  • FastReport在线报表设计器工作原理
  • js作用域和this的理解
  • Linux后台研发超实用命令总结
  • maven工程打包jar以及java jar命令的classpath使用
  • Netty源码解析1-Buffer
  • Service Worker
  • 动态魔术使用DBMS_SQL
  • 飞驰在Mesos的涡轮引擎上
  • 分享几个不错的工具
  • 解析 Webpack中import、require、按需加载的执行过程
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 少走弯路,给Java 1~5 年程序员的建议
  • 线性表及其算法(java实现)
  • 移动端解决方案学习记录
  • 自制字幕遮挡器
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (k8s中)docker netty OOM问题记录
  • (SpringBoot)第七章:SpringBoot日志文件
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)springcloud实战之config配置中心
  • (强烈推荐)移动端音视频从零到上手(上)
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十一)c52学习之旅-动态数码管
  • (转)原始图像数据和PDF中的图像数据
  • .a文件和.so文件
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .gitignore文件_Git:.gitignore
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET MVC之AOP
  • .NET 中 GetProcess 相关方法的性能
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .net操作Excel出错解决
  • .net解析传过来的xml_DOM4J解析XML文件
  • .Net组件程序设计之线程、并发管理(一)