zoukankan      html  css  js  c++  java
  • 十二、IO重定向

    1 管道

    1.1 管道

    • 定义

      管道技术是linux的一种基本的进程间通信技术,利用先进先出排队模型来指挥进程间的通信,可以把它当做是连接两个实体的一个单向连接器。

    • 作用范围

      Linux管道可用于应用程序之间、linux命令之间(例如:shell编程),以及应用程序和linux命令之间的通信

    • 语法

      command1 | command2 | command3 | ... | commandn
      
      • shell编程中管道符号是竖杠符号"|"
      • 当shell遇到管道符"|"后,前一个command(n-1)的输出发送给command(n),作为command(n)的输入

    1.2 cat和more命令

    • 语法

      cat [option] fileName
      more [option] [+linenum] fileNames
      
    • 说明

      • option指选项
      • filename指文件名
      • more命令中+linenum可以指定显示文件的起始行
      • cat命令在显示文件时不提供分页功能,而more命令在显示超过一页的文件时提供了分页功能
    • cat命令的选项名称及其意义

      选项 意义
      -a 显示文件的所有内容
      -b 由1开始对所有输出的行数编号,但对空白行不编号
      -E 每一行末显示"$"
      -n 由1开始对所有输出的行数编号
      -s 当遇到有连续两行以上的空白行,就替换为一行空白行
      -v 不可显示的字符(制表符、新行符和换页符除外)以可见的形式显示
    • more命令的选项名称及其意义

      选项 意义
      -num 一次显示的行数
      -d 提示使用者,在画面下方显示"Press space to continue,q to quit.",如果使用者按错键,则会显示“Press h for instructions”
      -l 取消遇到特殊字元 ^L(送纸字元)时会暂停的功能
      -f 计算行数时,以实际的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
      -p 不以卷动的方式显示每一页,而是先清除屏幕后再显示内容
      -c 跟-p相似,不同的是先显示内容,再清除其他旧资料
      -s 当遇到有连续两行以上的空白行,就替换为一行的空白行
      -u 禁止显示强调符,即不显示下划线
      +/ 在每个文件显示前搜寻该字串(pattern),然后从该字串之后开始显示
      +num 从第num行开始显示

    1.3 sed命令与管道

    • 语法

       | sed [选项] 'sed命令'    #sed在管道符"|"之后出现,表示sed命令对管道输入的数据进行处理
      
    • 示例

      variable1="Yahoo develops MapReduce Framework"
      
      variable2="Google"
      
      echo variable1
      
      echo variable1 | sed 's/Yahoo/${variable2}/g'
      

    1.4 awk命令与管道

    • 语法

      | awk [-F域分隔符] 'awk程序段'
      

      几乎所有可以用expr命令的字符串处理功能都可以用awk代替实现

    • 示例

      string='Speeding up small jobs in Hadoop'
      
      echo $string | awk '{print substr($string,25)}'
      
      awk -F ':' '{print '$1' | "sort"}' /etc/passwd
      
      # 特别注意的是,awk中调用linux命令需要用双引号将这些命令引起来
      
      awk 'BEGIN{while (("ls /usr" | getline d)>0) print d}'
      
      #当我们要用awk处理shell命令的输出时,需要引入getline函数将shell命令的输出保存到变量中,awk再对该变量进行处理
      

    2 I/O重定向

    • 定义

      I/O重定向是一个过程,这个过程捕捉一个文件、命令、程序或脚本,甚至代码块的输出,然后把捕捉到的输出作为输入发送给另外一个文件、命令、程序或脚本。

    2.1 文件标识符(FD)

    • 定义

      文件标识符是从0开始到9结束的整数,指明了与进程相关的特定数据流的源。

    • 说明

      • 当Linux系统启动一个进程(该进程可能用于执行shell命令)时,将自动为该进程打开三个文件:标准输入、标准输出和标准错误输出

      • 标准输入stdin、标准输出stdout和标准错误stderr输出,分别由文件标识符0,1,2标识

      • 该进程如果要打开其他的输入或输出文件,则从整数3开始标识

      • shell命令从标准输入读取输入数据,将输出送到标准输出,如果该命令再执行过程中发生了错误,则将错误信息输出到标准错误输出。

      • 如果需要将Shell命令的输出从标准输出复制一份到某个文件中,可以使用tee命令.

        who | tee output
        # tee命令产生的数据流向很像英文字母T,将一个输出分为两个支流,一个到标准输出,另一个到某输出文件
        # tee的-a选项,表示将shell命令的输出追加到某个文件的末尾
        ps | tee -a output
        

    2.2 I/O重定向符号及其用法

    • cat和>符号结合使用成为简易文本编辑器

      cat > filename
      # 1.cat命令后不加任何参数时,cat命令的输入是标准输入,即键盘输入
      # 2.I/O重定向符号">"将键盘输入写入文件
      # 3."Ctrl+D"组合键结束编辑
      
    • ">>>"和">"符号

      • ">>"符号将标准输出追加到已有文件的内容之后
      • ">"符号将文件的原有文件覆盖,然后写入标准输出的内容
    • ">|"符号

      • ">|"符号是强制覆盖文件的符号
      • ">|"与shell的noclobber选项有关,如果noclobber选项开启,表示不允许覆盖任何文件,而">|"符号则可以不管noclobber选项的作用,强制将文件覆盖
    • "n>>filename"、"n>|filename"、"n>filename"

      表示将FD为n的文件重定向到filename文件之中,三者的区别实际上是>>、>|和>这三个符号的区别

    • "<"符号

      "<"是I/O重定向的输入符号,它可将文件内容写到标准输入之中

    • "<<delimiter"符号

      "<<delimiter"符号称为此处文档(Here-document),delimiter称为分界符,该符号表明:shell将分界符delimiter之后直至下一个delimiter之前的所有内容作为输入。

      # 与cat > filename 结合使用
      
      cat >file1 <<CLOUD
      Hadoop is developed by Yahoo
      Google alse develops GFS and MapReduce
      CLOUD
      

      "-<<delimiter",即在"<<"符号前加上"-",这样输入文本行所有开头的"Tab"键都会被删除,但是,开头的空格键却不会被删除。

    2.3 exec命令的用法

    • 定义

      exec命令可以通过文件标识符打开或关闭文件,也可将文件重定向到标准输入,及将标准输出重定向到文件

    • 说明

      "&>file"可以同时将标准输出和标准错误输出重定向到文件

    2.4 I/O重定向符号及其意义

    • 基本I/O重定向符号及其意义

      符号 意义
      cmd1 | cmd2 管道符,将cmd1的标准输出作为cmd2的标准输入
      >filename 将标准输出写到文件filename之中
      <filename 将文件filename的内容读入到标准输入之中
      >>filename 将标准输出写到文件filename之中,若filename文件已存在,则将标准输出追加到filename已有内容之后
      >|filename 即使noclobber选项已开启,仍然强制将标准输出写到文件filename之中,即将filename文件覆盖掉
      n>|filename 即使noclobber选项已开启,仍然强制将FD为n的输出写到文件filename之中,即将filename文件覆盖掉
      n>filename 将FD为n的输出写到文件filename之中
      n<filename 将文件filename的内容读入到FD为n的输入之中
      n>>filename 将FD为n的输出写到文件filename之中,若filename文件已存在,则将FD为n的输出追加到filename已有内容之后
      <<delimiter 此处文档(Here-document)
    • 高级I/O重定向符号及其意义

      • 说明:需要结合'exec'命令使用

      • 示例

        exec 8<&0  # 将FD为0的输入复制到FD为8的文件
        
        exec 8<&- # 关闭FD 8,其他进程可以重复使用FD 8
        
      符号 意义
      n>&m 将FD为m的输出复制到FD为n的文件
      n<&m 将FD为m的输入复制到FD为n的文件
      n>&- 关闭FD为n的输出
      n<&- 关闭FD为n的输入
      &>file 将标准输出和标准错误输出重定向到文件

    3 命令行处理

    3.1 命令行处理流程

    • 定义

    • shell从标准输入或脚本读取的每一行称为管道(pipeline),每一行包含一个或多个命令,这些命令用管道符隔开,shell对每一个读取的管道按照流程进程处理

    • 流程图

    • 说明
      • 令牌可以是关键字、单词、也可以是I/O重定向器和分号
      • 令牌之间以元字符分隔
      • shell的元字符集合是固定不变的,包括空格、Tab键、换行字符、分号(;)、圆括号、输入重定向符(<)、输出重定向符(>)、管道符(|)和 '&' 符号

    3.2 eval命令

    • 定义

      eval命令将其参数作为命令行,让shell重新执行该命令

    • 示例

      pipe='|'
      eval ll $pipe wc -l
      
    • 说明

      • 命令结束符(;,|,&)、I/O重定向符(<,>)和引号这些对shell具有特殊意义的符号,必须直接出现在命令行中
  • 相关阅读:
    1022. 从根到叶的二进制数之和
    剑指 Offer 54. 二叉搜索树的第k大节点
    枚举--百练2811--熄灯问题
    UVA 572 BFS 图论入门
    百练1088 DP+DFS 迷宫问题
    poj 1661 动态规划 拯救老鼠
    入坑动态规划!POJ 1458字符串最大公共子序列
    文件后缀批处理
    奇妙的算法--UVA 679(二叉树的编号)
    栈_uva514
  • 原文地址:https://www.cnblogs.com/nuochengze/p/14563341.html
Copyright © 2011-2022 走看看