linux 标准输出流管道,初学Linux之标准 I/O 和管道

初学Linux之标准 I/O 和管道

通常对于程序来讲,输入输出数据的可以是键盘、鼠标、显示器等设备。但是我们输入的是命令,本身并没有输入“显示”这类命令和要求,但是系统就自动的在屏幕上输出我们命令指定的信息。系统本身默认对一些命令的输出进行了规范,这样也是减少了我们在使用Linux 过程中对输出的考虑,简化了不必要的繁琐的操作。对于这些默认的输入和输出,我们需要进行了解,这样对后面的程序学习以及脚本编辑都很有帮助。

一、三种标准 I/O

程序一般包括指令和数据,读入数据就是 Input ,输出数据是 Output ,在Linux中,一切皆文件,系统不会识别到具体的文件名,它是通过文件的(fd)文件描述符(数字代号)识别的,若是把键盘和屏幕都是作为文件,那么它们的 fd 是多少呢?下图我们通过一个已经打开的进程(7525),从进程中显示的三个编号分别为0、1、2,这三个编号就分别是系统对键盘输入,屏幕输出,屏幕报错的fd 。

这三个是系统默认的,我们将它们归为:标准输入(0),标准输出(1),标准错误输出(2)。很多命令在屏幕端显示的,都是标准输出。而一些在命令输入完成,回车运行过程中,要求我们使用键盘输入的,就是标准输入。比如 ls 在屏幕列出的文件和目录序列, cat 命令在运行过程中,我们在键盘输入的单词。当我们的输入不符合规范,或者程序运行出现中断,程序需要将错误的内容突出反馈给用户,在屏幕显示的就是标准错误输出。

3c8ce6380daa33c267ccb0e2e66a02de.png   

3c8ce6380daa33c267ccb0e2e66a02de.png

二、把 I/O 重定向入文件

重定向是指将原先的输入方向更改到其他的,比如从原先从键盘输入的,我们可以更换到其他方式,原先从从屏幕输出显示的,我们输出到其他位置。

首选的重定向方式是—输出重定向到文件。具体的操作方法是“完整命令      操作符号    文件名”。支持的操作符号包括:  >  把标准输出重定向到文件; 2>  把标准错误输出重定向到文件; &>  把两种输出一起重定向到文件 。三种都使用到了 “ > ”这个大于符号,这个符号是比较随意的符号,每次会将后面跟着的文件内容进行覆盖,对记录整体的数据是不好处理的,此时可以使用 set -C  禁止覆盖,set +C 恢复覆盖。在禁止覆盖的情况下,可以使用 “ >|” 这个符号,同同样实现覆盖,而“ >> ”双大于号是追加的,不是覆盖,禁止覆盖是没有关系的,可以使用“ >> ” , “ 2>> ” , “ &>> ” 。

3c8ce6380daa33c267ccb0e2e66a02de.png              

3c8ce6380daa33c267ccb0e2e66a02de.png

命令同时具备标准输出和标准错误输出的,可以使用下面的方法:COMMAND  > /PATH/FILE1  2> /PATH/FILE2 ,实现标准输出和错误输出重定向到不同的文件位置。另外这边需要提及的是:&> ,&>> 并不是对所有版本的Linux系统适用的,若是不能使用,可以在重定向的末尾 加上 2>&1 ,同样实现标准输出和错误输出重定向到同一个位置。例如:COMMAND >>/PATH/FIEL  2>&1 。

当多个程序的一起运行时,可以使用括号括起来,各个程序分号隔开,之后一起重定向到同一个位置。 ( COMMAND 1 ; COMMAND2 ; COMMAND3 ) >FILE.TXT

3c8ce6380daa33c267ccb0e2e66a02de.png  

3c8ce6380daa33c267ccb0e2e66a02de.png 

3c8ce6380daa33c267ccb0e2e66a02de.png         以上是将输出重定向,对应的,我们可以将标准输入重定向。和标准输出使用“ > ”类似,标准输入使用的是“ < ”。cat 命令本身是同时有标准输出和标准输入的。标准输入重定向的用法就是在命令的后面加上“ < FILE ” 。 

3c8ce6380daa33c267ccb0e2e66a02de.png    之前的f1文件里的信息是123,f2文件里的信息是456。示例中就用f2文件中的内容代替了cat命令的键盘输入。

以上是将标准输入重定向到文件的方法,还有这种多行重定向的方法,使用的符号是 “ <

3c8ce6380daa33c267ccb0e2e66a02de.png

三、tr 命令的使用

上面我们使用的都是 cat 这个命令,和 cat 一样包括标准输入和标准输出的命令还有很多,tr 命令就是其中之一,这个命令有字符处理的功能,这里可以着重了解一下。

tr 转换和删除字符

tr [OPTION]… SET1 [SET2]

常用的选项:  -c –C –complement:取字符集的补集

-d –delete:删除所有属于第一字符集的字符

-s –squeeze-repeats:把连续重复的字符以单独一个字符表示

-t –truncate-set1:将第一个字符集对应字符转化为第二字符集 对应的字符

3c8ce6380daa33c267ccb0e2e66a02de.png

四、使用管道链接命令

现实生活中的管道是头尾衔接,传递物体流的设备,在Linux中,将数据作为一种“流”,通过管道连接的命令,就可以将“数据流” 前后传递。Linux中的管道在命令中间用“ | ”表示。命令1 | 命令2 |命令3 |….. 管道将命令1的标准输出发送给命令2的标准输入,命令2的标准输出作为命令3的标准输入,如此反复。标准错误输出是无法通过管道传递的。可以利用 2>&1 | 或者 |& 。

3c8ce6380daa33c267ccb0e2e66a02de.png

当管道传递的数据不是标准输出,而是文件,那么不能作为标准输入传递给下一个命令,则可以使用管道中的 “ – ” 符号代替产生的文件,在管道前,作为输出的文件,在管道后,作为输入文件。

tar -cvf   –  /home   | tar  -xvf  –

另外,管道后面的命令,参数是多个,而管道前的标准输出是一串数据流,可以使用 | xargs 命令,将数据流中的空格隔开的数据,分成多个参数,一个个传递给管道后的命令处理。

3c8ce6380daa33c267ccb0e2e66a02de.png

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/89183

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值