一、I/O重定向

        所谓I/O重定向,即 I=input、O=output;就是将标准基本输入输出更改默认数据流机制。

系统中程序的数据流有三种:                                                     默认输出

    标准输入数据流      <------  标准输入    (standard input)     键盘

    标准输出数据流      ------>  标准输出   (standard output)显示器

    标准输出错误数据流-------> 错误输出   (standard error)   显示器

其中标准输入输出、错误输出可以用文件描述符(file descriptor)来表示

        标准输入    0

        标准输出    1

        错误输出    2


下面我们来看一下I/0重定向的符号含义

1.覆盖输出重定向:> 

         将用户执行的某条正确命令输出的结果重定向到指定路径中。不在默认显示打印在屏幕上.如果指定的文件存在并且里面有数据,将会覆盖输出到文件中。

        例如:#cat /etc/issue  > /testdir/test1.txt     

        //将cat /etc/issue 原本打印到屏幕上的结果重定向到指定/testdir/test1.txt中。如果重复执行将会覆盖其原有的内容。

     但是这里我们可以使用命令将覆盖输出关闭,以便误操作了重要文件。

set命令可以关闭掉覆盖输出:

      # set   -C  :关闭覆盖输出重定向

      # set  +C  :开启覆盖输出重定向

       但是尽管如此禁用了覆盖输出重定向,我们依然可以使用” >| “ 来对文件进行覆盖重定向输出。

        例如:#cat /etc/issue  >| /testdir/test1.txt      //这样不管set  命令关没关闭覆盖功能都可以覆盖原有的文件。    



2.追加输出重定向:  >>

       将用户执行的某条正确命令输出的结果重定向到指定路径中。不在默认显示打印在屏幕上.如果指定的文件存在并且里面有数据,将会追加在原有数据的后面并保存在文件中。

        例如: #cat /etc/issue  >> /testdir/test1.txt     

        //将cat /etc/issue 原本打印到屏幕上的结果重定向到指定/testdir/test1.txt中。如果重复执行将会一直追加其内容到指定的文件中。


3.覆盖输出错误流重定向: 2>

        当我们使用上述的任意一条命令时,不小心吧命令或文件地址写错了,系统将会给出错误提示信息,但如果我们不想他显示在屏幕上,依然可以使用重定向把他输出到另外一个地址。

        例如:#catt  /etc/issue  > /testdir/test1.txt     //此时我们执行了一个并存在的命令,那么系统将会给出错误的提示信息。

     详解  I/O重定向及管道_standard


     但是如果我们使用“ 2> ”来定义时,屏幕上将不会显示错误信息,而是输出到指定的文件中。

     详解  I/O重定向及管道_error_02

    注意:第三行为文件内的内容。



4.追加输出错误流重定向: 2>>

        用法同上,只是错误信息不会覆盖原有的文件内容,而是追加到文件中数据末行。

    此前已经多次执行错误命令到此文件

       详解  I/O重定向及管道_显示器_03


5.合并标准输出流和标准错误输出流: &> 

    这能让我们能把错误的和正确的数据流输出到一个或两个文件内,就不用分别指定。


        例1:第一次我们输出的是正确的命令和地址,我们查看之后确实是正确的数据流的数据,这样和第一个覆盖输出重定向是一样的

            详解  I/O重定向及管道_standard_04


      现在第二次我故意把文件地址写错,然后在查看,文件中原有的内容就被替换成错误的输出信息了。这样和“2>”的用法相同了,但是现在只使用了“&>”就能完成两个不同的任务。但这是覆盖输出,追加输出我应该不用再说了吧。

                 详解  I/O重定向及管道_standard_05



        例2:我们想把标准输出的结果输出到一个文件,标准错误输出到另一个文件,这样也可以实现的。我们可以重复使用重定向,这样就解决了这个问题

  现在我输入的是正确的,所以应该输出到a3里,查看一下,a3里确实是前一个输出的正确数据

        详解  I/O重定向及管道_standard_06


现在我把文件地址写错,然后应该把错误信息写到a4中,我们查看一下a4,确实是系统提示的错误信息。               详解  I/O重定向及管道_显示器_07

      这里是用的重复使用重定向,当前一个条件满足时,就将结果输出到其内,但如果前一个条件不满足,又正好满足第二个时,就会将结果输出到其内。当然,还有更多的实现办法,童鞋们自己去研究吧!

 


6.合并多个程序的标准输出(其余的举一反三)

例1:( cal 2007 ; cal 2008 ) > all.txt

//括号中内是命令分别执行,然后将口号内的命令输出结果覆盖输出给all.txt中。




7.标准输入重定向

    不再从基本的输入设备读取数据,而是在给定的内容或文件内读取数据内容

    例1:cat < /etc/passwd    //这个用法基本没人使用。

    例2:cat < /etc/passwd >/testdir/test1.txt       

    //这表示在passwd里读取数据然后覆盖保存在test1.txt里。(当然也同样也可以使用追加保存)




二、I/O重定向小例子:

        (使用Here Document ,此处创建文档,下面1-2个例题都是使用的这个方法。)

1)、给root用户发邮件,标题为“hello” ,内容随便写,使用标准输入重定向。

        发邮件:mail -s hello wang  <<EOF

            详解  I/O重定向及管道_显示器_08

    其中:mail -s 表示发邮件,hello为主题,root为接收人,最后面的追加输入重定向结束符为EOF,EOF表示当我们写完邮件时输入“EOF”然后确认,就会结束编写邮件并发送。当然后面的结束符可以任意自定。


2)、输入内容然后覆盖保存到EOF.txt里。第一个EOF为结束符。当输入完数据之后再输入结束符即可结束编辑。

        详解  I/O重定向及管道_显示器_09

 

3)、这是一个清空文件的快捷的方法,使用输出重定向,将文件的内容清空。

            #> test1.txt    

              //使用覆盖输出重定向,我们什么内容也没写,然后覆盖到后面的文件中,那文件中的数据不就被覆盖了吗。

还有很多使用的小技巧,慢慢研究吧。




四、管道

linux哲学思想之一,组合小功能或程序,完成复杂任务,刚好可以附加给管道这个兄弟。

管道,连接一个个小程序,实现将前一个命令的输出直接定向给后一个程序当做输入数据流,从而完成复杂任务。

管道符: “ | ”

例1:将/etc/passwd文件转换成大写之后取出倒数第1行的第6个字段。

                tr  'a-z' 'A-Z' < /etc/passwd | tail -1 | cut -d: -f6   

    详解  I/O重定向及管道_显示器_10


例2:将/etc/passwd文件中的所有非字母数字删除,然后把a-c的字母转换为大写之后显示到屏幕并保存到/testdir/pass.txt中

        #tr -d '[[:punct:]]' < /etc/passwd | tr 'a-c' 'A-C' | tee /testdir/pass.txt    //这里我们使用了tee命令。他的作用是将前面的结果打印到屏幕并且保存到指定文件中。

     详解  I/O重定向及管道_error_11

我们查看屏幕和文件中的内容都是一样的。这就是管道 。

     详解  I/O重定向及管道_显示器_12



五、tr(translate)转换

    tr [option]... set1 [set2]   

         1.把输入到set1中的数据统统转换成set2中的数据内容。

         2.把使用-d选项把出现在set1中的数据删除掉。

         3.“set”中可以使用正则表达式。


用法:

1.tr  'set1'  'set2'    //出现在set1中的数据装换成set中的数据,一一对应来转换的。

          详解  I/O重定向及管道_显示器_13


2.tr -d 'set1‘   //删除出现在set1中的数据。凡是出现在set1里面的数据都会被删除。

                详解  I/O重定向及管道_standard_14

   当然前面两种都是用于测试,我们可以导入文件来进行转换或删除。


3.删除/etc/passwd/文件中的所有数字

        //我们使用的是正则表达式,“alnum”表示所有字母和数字,忽略字母大小写,然后后面跟一个文件,表示重定向标准输入文件中的内容给tr命令然后由tr命令进行处理。

          详解  I/O重定向及管道_error_15

 我们还可以将转换或删除处理后的数据保存到另一个文件中 

    

4.将/etc/issue文件中的所有数据装换成大写然后保存到/testdir/issue.txt中.

    这里使用的是覆盖输出,当然我们也可以使用追加输出,这里就不在说了。

        详解  I/O重定向及管道_standard_16

   


 以下选项不示例,慢慢去尝试

以下的somefile可选。

    -c : 取反

            #tr -c 'a' 'x' < somefile  // 导入文件,将文件中除了set1内的字符,把其余的全部字符转换为set2的字符。

    -d :删除set1内出现的字符

            #tr -d 'abc' <somefile   //导入文件,将文件中出现在set1中的字符全部删除掉。

    -s:把连续的多个字符转换为单一的字符显示   

            #tr -s 'abc'  //将出现在set1里的字符只要是连续的2个以上通通只显示一个

    -t:只转换set1和set2对应的字符,其余的不装换

            #tr -t 'abc' 'xyz' < somefile    //将出现在set1中的字符通通转换成set2中的字符,其余的保持不变。等于tr 不加选项只有参数转换。





六、tee 

    tee命令可以将数据重定向到文件,并作为后面命令的stdin。

//将ls -l 执行的结果用管道传送给tee命令,然后由tee命令将结果保存到指定文件中并把结果传给less命令来查看。

          详解  I/O重定向及管道_显示器_17


[root@localhost /]# ls -l | tee file.txt | less    

    //这是屏幕打印出来的,我们来看看文件里有没有。

    total 106

    lrwxrwxrwx    1 root root    12 Jul 26 01:19 a2link -> ./testdir/a2

    dr-xr-xr-x.   2 root root  4096 Jul 25 10:37 bin

    dr-xr-xr-x.   5 root root  1024 Jul 25 09:10 boot

    drwxr-xr-x   20 root root  3840 Jul 25 11:44 dev

    drwxr-xr-x. 102 root root 12288 Jul 26 19:42 etc

    drwxr-xr-x.   5 root root  4096 Jul 26 17:44 home

    drwxr-xr-x    3 root root  4096 Jul 26 15:18 testdir

    drwxrwxrwt.   4 root root  4096 Jul 26 19:55 tmp

    drwxr-xr-x.  14 root root  4096 Jul 25 09:00 usr

    drwxr-xr-x.  23 root root  4096 Jul 25 09:07 var

    (END) 


    //下面这个为文件中的数据。这就是tee的作用。

    [root@localhost /]# ls -l | tee file.txt | less

    [root@localhost /]# cat file.txt 

    total 106

    lrwxrwxrwx    1 root root    12 Jul 26 01:19 a2link -> ./testdir/a2

    dr-xr-xr-x.   2 root root  4096 Jul 25 10:37 bin

    dr-xr-xr-x.   5 root root  1024 Jul 25 09:10 boot

    drwxr-xr-x   20 root root  3840 Jul 25 11:44 dev

    drwxr-xr-x. 102 root root 12288 Jul 26 19:42 etc

    drwxr-xr-x.   5 root root  4096 Jul 26 17:44 home

    dr-xr-xr-x.  11 root root  4096 Jul 25 09:04 lib

    dr-xr-xr-x.   9 root root 12288 Jul 25 10:37 lib64

    drwx------.   2 root root 16384 Jul 25 08:59 lost+foun

    


七、null  空,译为垃圾站

配置文件为:/dev/null   

        我们可以把不想提示信息显示在屏幕上,即可通过重定向把数据流放入null中,就不会显示了。

        例:把ls -l  /显示出来的内容扔进垃圾桶(null)

     ls  -l  / >/dev/null   //例没有任何执行结果反馈,查看null里也不会有任何信息。

           详解  I/O重定向及管道_standard_18