初学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
下一篇 2017-12-02

相关推荐

  • 搭建lnmp实现动静分离

    LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。 (nginx主机)web 处理静态内容 172.16.250.149 (fpm server   mariad bserver)处理动态内容 172.16.253.131 以上为两台CentOS7.3主机 试验拓扑图如下:   ==…

    2017-07-22
  • N22-第4周作业-冥界之王

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。    [root@CentOS6 ~]# cp -r /etc/skel/ /home/tuser1/    [r…

    Linux干货 2016-09-19
  • N22-love cat 17周博客作业第2部分-构建一个LVS-DR模型的高性能集群

    题目: 搭建一个LVS-DR模型的高性能集群,并实现以下功能:       (1)、wordpress程序通过nfs共享给个个realserver;       (2)、后端realserver中的nginx和php分离; 第17周   第2部分 网…

    Linux干货 2016-08-15
  • kickstart安装系统

    很多时候要安装很多机器是很繁琐,我们可以利用kickstart网络启动更加方便的去安装系统。 首先准备环境,安装相关程序。 [root@localhost ~]# yum -y install sytem-config-kickstart [root@localhost ~]# yum&n…

    Linux干货 2016-09-19
  • 运维学习笔记-Puppet之Hiera初探

    为什么使用Hiera? Puppet中的manifest同时包含静态的代码(判断/循环逻辑,依赖关系,类定义,资源类型定义等等)和动态的数据(类声明时的参数值和资源声明时的属性值)。说代码是静态的是因为如果在设计阶段考虑比较全面,代码写成之后是很少变化的。但是数据要根据具体情况赋予不同的值。如果manifest设计的不是很灵活,比如某些数据被固化(hardc…

    Linux干货 2016-07-07
  • Nginx的简单配置和简单实验..

    yum install nginx #安装Nginx,安装包在epel源中 systemctl start nginx.service #启动服务 #实验:配置一个虚拟主机 #先给一个网页文件 ~]#mkdir /data/nginx/vhost1 -pv ~]#vim /data/nginx/vhost1/index.html <h1>Ngin…

    Linux干货 2017-06-19