美文网首页Linuxshell
shell快讲第二节--管道与重定向

shell快讲第二节--管道与重定向

作者: 梦回上玄 | 来源:发表于2019-08-13 11:31 被阅读0次

    shell快讲第一节--shell基础
    shell快讲第二节--管道与重定向
    shell快讲第三节--正则表达式
    shell快讲第四节--sed与awk
    shell快讲第五节--shell语法基础
    shell快讲第六节--shell函数编程
    shell快讲第七节--shell编程规范与调试
    shell快讲第八节--shell编程实战

    管道

    严格的说管道属于IO重定向的一部分,但是我们不思考那么多,管道在Shell操作中经常遇到,管道符号是“|”,它是我们在命令与命令之间(或者说进程与进程之间)通信的一种手段,我们先看下原理


    guandao.png

    我们实际来操作一下:

    >>> ls -l |grep *.png |wc -l #查找当前目录的所有文件中的png文件并输出它们的数量
    >>> cat testfile |grep error #过滤某个文件中的包含错误信息的行
    

    重定向

    类型 文件描述符 默认情况 对应设备位置
    标准输入 0 从键盘获得输入 /dev/stdin
    标准输出 1 输出到控制台 /dev/stdout
    错误输出 2 输出到控制台 /dev/stderr

    1.STDIN

    stdin代表shell的标准输入,对终端来说,标准输入就是键盘,默认定向到控制台,当然我们可以使用“<”符号定向到其他地方作为stdin输入(累次开发中的生产消费模式),当然必须注意不是所有的命令都可以接收stdin输入。如下例子:

    #测试输入,cat可以接受stdin的输入并把内容打印出来
    >>> cat #随便输入点什么
    
    stdin效果演示
    #将某个文件作为stdin输入给cat命令使用
    >>> echo "hello world" > testfile #创建testfile文件并保存一段话
    >>> cat < testfile #讲testfile作为cat的输入
    

    另外我们可以使用“<<”进行追加模式的stdin输入,相对于"<",“<<”我们更加常用:

    >>> cat >testfile <<EOF #注意"<<"
    >你好
    >hello world
    >EOF
    #此时生成一个testfile文件,我们打开它
    >>> cat testfile
    #没错,这就是上节课的例子
    

    2.STDOUT

    stdout代表shell的标准输出,输出到终端显示器,shell和程序的绝大多数输出都是标准输出,默认是输出到控制台,当然我们可以使用“>”重定向到其他地方,">>"是它的追加模式

    >>> ls -l #标准输出
    >>> ls -l >test1 #输出到test1里面
    >>> echo "追加文档到test1" >> test1
    

    3.STDERR

    shell对于错误消息的处理和普通的输出是分开的,某些开发写的程序不标准,经常会把标准输出和标准错误输出弄混,然后运维就更辛苦点了。标准错误输出和标准输出一样都是默认输出到控制台的。stderr的默认输出虽然是控制台但是却不会被“>”符号重定向,我们看个例子:

    >>> ls -l ajflajfa >testfile #讲ajflajfa文件的属性输出到testfile里面,但是ajflajfa根本不存在
    >>> cat testfile #查看文件
    

    实验过后其实会发现stderr的输出不会像stdout那样被重定向到textfile里面,但是在日常工组中,我们会有要求把所有的正常的日志输出,非正常的日志输出都放在一个文件里面

    #将标准输出,标准错误输出均输入到一个文件里面
    >>> ls -l test1 test2 >testfile 2>&1  #test1存在,test2不存在,或:
    >>> ls -l test1 test2 &>testfile #另外一种写法
    >>> cat testfile
    >>> ls -l test1 test2 2>errout 1>output #错误信息输出到errout 正确的信息输出到output
    
    

    如下是符号的重定向对比列表

    符号 说明
    > 把stdout(标准输出)重定向到文件,文件内容会被覆盖
    >> 把stdout(标准输出)重定向到文件,内容追加到文件的末尾
    2> 把stderr(标准错误输出)重定向到文件,文件内容会被覆盖
    2>> 把stderr(标准错误输出)重定向到文件,内容追加到文件末尾
    2>&1或&> 把stdout和stderr作为一个数据流重定向到文件,文件内容会被覆盖
    &>> 把stdout和stderr作为一个数据流重定向到文件,内容追加到文件末尾
    < 将文件重定为stdin
    << 作为stdin输入的文件可以被追加,不过需要使用EOF作为文件的截断符号

    重定向在接下来的章节会比较长用到,这里列几个基于管道的命令工具传送门,这些工具大家自己练习

    总结

    希望大家结合自己的工作场景练习上面的命令,如果有开发基础,理解std并不困难,不过有无开发基础都不妨理解管道这个概念。

    相关文章

      网友评论

        本文标题:shell快讲第二节--管道与重定向

        本文链接:https://www.haomeiwen.com/subject/xkjvjctx.html