Linux下的I-O重定向与管道

发布时间 2023-11-28 23:31:30作者: 手可摘星陈先生

Linux下的I/O重定向与管道

一、I/O设备

Linux中,对系统进行操作时,就需要I/O设备与系统产生交互,同时会产生三种数据,标准输入(0)、标准输出(1)、标准错误(2)。其中标准输入(stdin)默认接受来自键盘的输入,标准输出(stdout)和标准错误(stderr)默认向终端窗口输出,改变默认输出和出入的位置,就是I/O重定向。

二、输出重定向到文件

  • >:把标准输出重定向到文件中
  • 2>:把标准错误重定向到文件中
  • &>:把所有输出重定向到文件中,或:COMMAND > /path/to/file.out 2> &1(注意命令顺序)

“>”会使原来的文件中所有的内容被覆盖,使用“set -C”可以禁止覆盖已有的文件,如果想强制覆盖,可以使用“>|”选项。使用“set +C”可以解锁禁止覆盖。

  • >>:在原有的内容上追加重定向的标准输出内容
  • 2>:重定向标准错误输出流覆盖原文件
  • 2>>:重定向标准错误输出流追加至原文件
  • &>>:标准输出和错误输出追加到文件中,或:COMMAND >> /path/to/file.out 2>> &1 (注意命令顺序)

把同一个命令的标准输出和错误输出分别定向到不同的文件:

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

当需要合并多个程序的输出时,使用括号“()”

三、tr命令的使用

tr用于从标准输入中转换和删除字符,格式为:tr [OPTION]… SET1 [SET2],其中SET1用于查询匹配字符,SET2用于替换和删除字符

常用的选项有:

  • -c –complerment:取字符集的补集
  • -d –delete:删除所有属于SET1字符集的字符
  • -s –squeeze-repeats:把连续重复的的字符以单独一个字符表示
  • -t –turncate-set1:将第一个字符集对应的字符转化为第二个字符集对应的字符

四、重定向到输入

重定向输入

  • tr 'a-z' 'A-Z' < /etc/issue  把/etc/issue中的小写字符转换为大写字符
  • tr -d abc < /etc/fstab 删除/etc/fstab中的abc
  • cat > file.txt 把键盘输入的内容写到文件中,按“ctrl+d”结束输入
  • cat > filea < fileb 把fileb中的内容覆盖到filea中

五、管道

管道可以把一个进程的标准输出流与另一个进程的标准输入流连接起来。bash中用“|”在两个命令之间创建管道。

例如:

  • less:逐页查看输入
    • ls -l /etc |less
  • mail:通过电子邮件发送输入
    • echo "test email"
    • 把test email中的内容以邮件的形式发送给用户stu28
      • mail -s "text" stu28
  • lpr:把输入发送给打印机
    • $ echo "test print" | lpr -P printer_name

六、tee命令

  1. 功能说明:

    读取标准输入的数据,并将其内容输出成文件。

  2. 语法:

    tee [OPTION]… [FILE]…

  3. 补充说明:

    tee命令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成为文件。

  4. 常用参数:

    • -a –append:附加到已有文件的后面,而不是覆盖原文件。
    • -i –ignore-interrupts:忽略中断信号
    • –help:在线帮助
    • –version:显示版本信息。
  5. 把命令1的STUDOUT保存在文件中,然后管道输入给命令2

    命令1 | tee 文件名 | 命令2

  6. 使用:

    • 保存不同阶段的输出
    • 复杂管道的故障排除
    • 同时查看和记录输出