十二、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具有特殊意义的符号,必须直接出现在命令行中
posted @ 2021-03-21 17:02  Norni  阅读(159)  评论(0编辑  收藏  举报