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

前面我们已经了解了文件系统的部分内容,我们可以通过 ls 命令让当前目录下的内容都显示在屏幕上,也可以使用 pwd 命令,显示当前的所在的目录路径。但是我们输入的是命令,本身并没有输入“显示”这类命令和要求,但是系统就自动的在屏幕上输出我们命令指定的信息。由此可以想象到,系统自身有默认的一种输出方式,同时,有输出就有输入,当输入的和系统无关,系统也会自动提示错误,以上就是我们接下来要了解的基础内容——标准 I/O。具体的涉及内容包括:三种 I/O 设备,把 I/O 重定向入文件,tr 命令的使用,使用管道链接命令。

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

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

一、三种标准 I/O

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

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

捕获3    捕获4

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

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

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

捕获5               捕获6

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

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

捕获7   捕获8  捕获9         以上是将输出重定向,对应的,我们可以将标准输入重定向。和标准输出使用“ > ”类似,标准输入使用的是“ < ”。cat 命令本身是同时有标准输出和标准输入的。标准输入重定向的用法就是在命令的后面加上“ < FILE ” 。 捕获1    之前的f1文件里的信息是123,f2文件里的信息是456。示例中就用f2文件中的内容代替了cat命令的键盘输入。

以上是将标准输入重定向到文件的方法,还有这种多行重定向的方法,使用的符号是 “ <<终止词 ” ,位置也是在命令的后面。但是要使用终止词在符号后面。

捕获4

三、tr 命令的使用

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

tr 转换和删除字符

tr [OPTION]… SET1 [SET2]

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

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

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

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

捕获2

四、使用管道链接命令

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

捕获5

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

tar -cvf   –  /home   | tar  -xvf  –

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

捕获6

 

 

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

(1)
hack王和juhack王和ju
上一篇 2017-12-02 16:08
下一篇 2017-12-02 19:49

相关推荐

  • 无痛之ext3升ext4[原创]

    一台文件存储服务器单目录下子目录已经突破31998数限制,造成无法继续创建子目录,服务器系统环境为CentOS5.4 内核版本为2.6.18。解决方案只能是升级到ext4文件系统,首先到https://ext4.wiki.kernel.org/index.php/Ext4_Howto查了一下资料,文中的第一句便是“Ext4 was released as a…

    Linux干货 2015-03-27
  • CentoS 6.8 安装(小白请进)

    先说点题外话,我现在还是一个小白,刚接触‘高大上’的linux不久,随着深入的学习了解,兴趣越来越浓,这个东西很有意思的,不像学windows那样枯燥无味,真的,不信?欢迎加入马哥大家庭。 废话不多说,注意了:前方高能!!! 首先呢,先下载一个VMware Workstation这个虚拟机软件,它的作用很强大,可以使你在一台机器上同时运行一个甚至多个linu…

    2017-02-17
  • Linux文件管理相关及命令别名、执行状态等

    Linux文件管理相关命令有:cp,mv,rm         文件查看类命令有:cat,tac,head,tail,more,less         接下来,逐个介绍:   &…

    Linux干货 2016-11-04
  • 马哥教育网络19期+第十一周课程练习

    1、详细描述一次加密通讯的过程,结合图示最佳。 SSL协议基础:     SSL协议位于TCP/IP协议与各种应用层协议之间,本身又分为两层:     (1)、SSL记录协议:建立在可靠传输层协议(TCP)之上,为上层协议提供数据封装、压缩、加密等基本功能。  &nbs…

    Linux干货 2016-08-15
  • Linux文件查找的使用方法

    文件查找的方法 locate命令       非实时查找(数据库查找): locate查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db    依赖于事先构建的索引;索引的构建是在系统较为空闲时自动进行(周期性任务);管理员手动更新数据库(updated…

    Linux干货 2016-08-15
  • 文件查找locate和find

    locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db 依赖于事先构建的索引 索引的构建是在系统较为空闲时自动进行(周期性任务),管理员手动更新数据库(updatedb) 索引构建过程需要遍历整个根文件系统,极消耗资源 工作特点: •查找速度快 •模糊查找 •非实时查找 •搜索的是文件的全路径,不仅仅是文件名 •…

    2017-08-11