LINUX企业运维 March 21, 2020

十三、IO文件重定向及管道深入讲解

Words count 4.5k Reading time 4 mins. Read count 0

(一)标准输入和输出

程序: 指令+数据

  读入数据:Input

  输出数据.Output

  打开的文件都有一个fd:file descriptor(文件描述符)

  Linux给程序提供三种I/O设备

  标准输入(STDIN)-o默认接受来自键盘的输入

  标准输出(STDOUT)-1默认输出到终端窗口

  标准错误(STDERR)-2默认输出到终端窗口

  I/O重定向:改变默认位置

  可以通过对相关命令进行重定向从而实现记录一些操作过程中的操作日志,包括输出日志,以及错误日志。

(二)把输入和错误重定向到文件

  STDOUT和STDERR可以被重定向到文件

  命令   操作符号   文件名

  支持操作符号包括:

    > 把STDOUT重定向到文件

    2> 把STDERR重定向到文件

    &>把所有输出重定向到文件

  >文件内容会被盖

    set -C禁止将内容禮盖已有文件,但可追加

    >|file强制覆盖

    set+C允许覆盖

  >>原有内容基础上,追加内容

  2> 覆盖重定向错误输出数据流

  2>>追加重定向错误输出数据流

  标准输出和错误输出各自定向至不同位置

    COMMAND>/path/to/file.out2>/path/to/error.out

  合并标输出和错误输出为同一个数据流进行重定向

  &>覆盖重定向

  &>>追加重定向

  COMMAND>/path/to/file.out2>&1(顺序很重要)

  COMMAND>>/path/to/file.out2>&1

  ():合并多个程序的STDOUT

    (cal2007;cal2008 > all.txt

(三)tr 命令

  tr转换和删除字符

  tr [OPTION]...SETI[SET2]

  选项:

    -c—C–complement:取字夺集的补集

    -d–delete:删除所有属于第一字符集的字符

    -s–squeeze-repeats:把连续重复的字以单独一个字符表示

    -t–truncate-setl:将第一个字符集对应字符转化为第二字符集对应的字符

    [:alnum:]·字母和数字[:alpha:]·字母[:cntrl:]:控制(非打印)字符[:digit:]:数字

    [:graph:]:图形字符[:lower:]:小写字母[:print:]·可打印字符[:punct:]:标点符号

    [:space:]:空白字符[:upper:]:大写字母[:xdigit:]:十六进制字符

  把多行发送给STDIN

  使用”<<终止词”命令从键盘扌巴多行重导向给STDIN

  直到终止词位置的所有文本都发送给STDIN

  有时被称为就地文本(heretext)

  mail –s “PIeaseCaII”admin@magedu.com<<END

    >Hi Wang,

    >Please give me a call when you get in.We may need

  >to do some maintenance on server1.

  >

  >Details when you’re on-site

  >Zhang

  >END

管道

  管道(使用符号”|”表示)用来连接命令

  命令1|命令2|命令3|…

  将命令1的STDOUT发送给命令2的STD|N,命令2的STDOUT发送到命令3的STD|N

  STDERR默认不能通过管道转发,可利用2>&1或|&实现

  最后一个命令会在当箭shell进程的子shell进程中执行用来

  组合多种工具的功能

  ls |tr 'a-z' 'A-Z'

  less: 一页一页地查看输入

  ls –l /etc丨less

  mail:通过电子邮件发送输入

    echo “testemail”|mail-s “test”user@example.com

  lpr:把输入发送给打印机

    echo”testprint”|lpr –P printer_name

管道中-符号

  示例:

  将/home里面的文件打包,但打包的数据不是记录到文件,而是传送到stdout,经过管道后,将tar-cvf-/home传送给后面的tar-xvf一后面的这个-则是取前一个命令的stdout,因此,就不需要使用临时file了

  tar –cvf - /home | tar –xvf –

  重定向到多个目标

  命令1 | tee[-a]文件名 | 命令2

    把命令1的STDOUT保存在文件中,做为命令2的输入

    -a追加

  使用

  保存不同阶段的输出

  复杂管道的故障排除

  同时查看和记录输出

0%