IO重定向及管道

作者: 香吉矢 | 来源:发表于2017-08-23 22:19 被阅读0次

tr,tee

程序的IO

简单的说程序由指令(命令)和数据(操作对象)组成,在linux上一切皆文件,程序操作对象(数据)来自系统上的各种文件即程序的输入,由程序处理之后输出的结果即程序的输出

  • 数据的输入与输出
    • 可用于输入的设备:文件,键盘设备、文件系统上的常见文件、网卡等
    • 可用于输出的设备:文件,显示器、文件系统上常见的文件、网卡等
  • 程序数据流的三种状态或形式
    • 输入的数据流:标准输入(stdin),默认为从键盘
    • 输出的数据流:标准输出(stdout),默认输出到显示器
      命令执行所回传的正确的信息
    • 错误输出数据流:错误输出(stderr),默认输出到显示器
      命令执行失败后,所回传的错误信息
  • fd:file descriptor,文件描述符
    简单说,它是一个索引值,指向 内核为每一个进程所维护的该进程打开文件的记录表;
    本人目前的理解只有这么多,后续学习中在进行补充文件描述符的相关知识。
    IO重定向会围绕描述符来展开,列举以下三种文件描述符
    • 标准输入:0
    • 标准输出:1
    • 错误输出:2
IO重定向

不使用系统默认的标准输入输出,而是重新指定,即输入重定向,输出重定向,错误输出重定向,双重输出重定向(一次单独地送到不同的地方)。IO重定向其实就是让已创建的FD指向其它的文件(修改其链接的文件)。输入输出数据流的位置用FD标识

输出重定向
  • 标准输出重定向
    • ,即1>
      特性:覆盖输出
      * >>,即1>>
      特性:追加输出
      * # set -C
      禁止覆盖输出重定向至已存在的文件,只对当前shell进程生效
      此时可使用强制覆盖输出:>|
      * # set +C
      关闭上述特性

  • 错误输出重定向
    • 2>
      特性:覆盖追加输出
    • 2>>
      特性:追加错误输出
  • 合并标准输出流和错误输出流
    • &>,覆盖合并
    • &>>,覆盖追加
    • COMMAND > /path/to/somefile 2>&1,前面>是覆盖后面>就是覆盖
    • COMMAND >> /path/to/somefile 2>&1,前面>>是追加后边的>就是追加
  • 特殊设备:/dev/null
    将输出的数据丢到此目录,所有的数据都会无声无息被丢弃。根据命令的执行结果可以判断目录及文件的存在与否及内容有无
输入重定向

<,会经常和tr命令一起使用。介绍下tr命令的用法

  • image.png
  • Here Document :<<,此处创建文档

    • cat << EOF
    • cat > /PATH/TO/SOMEFILE << EOF
管道

链接程序,实现前一个命令的输出直接定向到后一个程序并当作输入数据流(Linux的哲学思想)
只会将最后一个命令的执行结果,作为标准输出,前面的命令的输出都会作为下一个命令的输入,不会在屏幕上显示了。
COMMAND1 | COMMAND2 | COMMAND3 |……
管道符与tee命令结合使用,将前一个命令的标准输出保存一份,然后继续通过管道符送到下一个命令,实现命令分方向发送。tee介绍如下:

  • image.png
相关演示

[root@localhost mytest]# touch fedora   \\创建一个空文件
[root@localhost mytest]# ll
总用量 0
-rw-r--r--. 1 root root 0 8月 13 22:50 fedora
[root@localhost mytest]# echo diyihang > fedora   \\将echo回显的内容重定向到fedora
[root@localhost mytest]# cat fedora   
diyihang
[root@localhost mytest]# echo dierhang > fedora   \\覆盖重定向,第一次的内容被覆盖
[root@localhost mytest]# cat fedora
dierhang
[root@localhost mytest]# echo desanhang >> fedora   \\追加重定向
[root@localhost mytest]# cat fedora
dierhang
desanhang
[root@localhost mytest]# set -C   \\禁止重定向覆盖已存在的文件,即使文件为空的。
[root@localhost mytest]# echo disihang > fedora   
-bash: fedora: 无法覆盖已存在的文件
[root@localhost mytest]# echo disihang >> fedora   \\只可以追加
[root@localhost mytest]# cat fedora
dierhang
desanhang
disihang
[root@localhost mytest]# echo dierhang >| fedora   \\强制覆盖
[root@localhost mytest]# cat fedora
dierhang
[root@localhost mytest]# set +C   \\取消进制覆盖重定向
[root@localhost mytest]# echo diyihang > fedora
[root@localhost mytest]# cat fedora
diyihang
[root@localhost mytest]# > fedora
[root@localhost mytest]# cat fedora
[root@localhost mytest]# echo dierhang > suse   \\重定向的文件不存在,会自动创建此文件
[root@localhost mytest]# ll
总用量 8
-rw-r--r--. 1 root root 9 8月 13 22:54 fedora
-rw-r--r--. 1 root root 9 8月 13 22:54 suse
[root@localhost mytest]# cat suse
dierhang
[root@localhost mytest]# > centos   \\重定向到新文件,什么也没有,即创建空文件,相当于touch
[root@localhost mytest]# ll
总用量 8
-rw-r--r--. 1 root root 0 8月 13 22:54 centos
-rw-r--r--. 1 root root 9 8月 13 22:54 fedora
-rw-r--r--. 1 root root 9 8月 13 22:54 suse
[root@localhost mytest]# ll centos1
ls: 无法访问centos1: 没有那个文件或目录
[root@localhost mytest]# ll centos1 2> ubuntu
[root@localhost mytest]# cat ubuntu
ls: 无法访问centos1: 没有那个文件或目录
[root@localhost mytest]# ll centos2 2>> ubuntu
[root@localhost mytest]# cat ubuntu
ls: 无法访问centos1: 没有那个文件或目录
ls: 无法访问centos2: 没有那个文件或目录
[root@localhost mytest]# cat fedora
diyihang
[root@localhost mytest]# cat fedora &> suse   \\合并重定向
[root@localhost mytest]# cat suse
diyihang
[root@localhost mytest]# cat fedora1 &>> suse
[root@localhost mytest]# cat suse
diyihang
cat: fedora1: 没有那个文件或目录
[root@localhost mytest]# cat fedora1
cat: fedora1: 没有那个文件或目录
[root@localhost mytest]# cat fedora1 > suse 2>&1
[root@localhost mytest]# cat suse
cat: fedora1: 没有那个文件或目录
[root@localhost mytest]# cat fedora > suse 2>&1
[root@localhost mytest]# cat suse
diyihang
[root@localhost mytest]# cat fedora1 >> suse 2>&1
[root@localhost mytest]# cat suse
diyihang
cat: fedora1: 没有那个文件或目录
[root@localhost mytest]# ls /tmp/mytest/
centos fedora suse ubuntu
[root@localhost mytest]# ls /tmp/mytest1 &> /dev/null   \\可以通过合并重定向到null文件,根据命令执行的状态值,判断是否有该目录。
[root@localhost mytest]# echo $?   \\返回值为2,命令执行失败,所以没有mytest1目录
2
[root@localhost mytest]# ls /tmp/mytest &> /dev/null
[root@localhost mytest]# echo $?   \\返回值为0,命令执行成功,所以有mytest目录
0
[root@localhost mytest]# cat fedora
diyihang
dierhang
disanhang
disiheng
5diwuhang6
di6hang
[root@localhost mytest]# tr [a-z] [A-Z] < fedora   \\通过符号"<"将文件的内容送给命令tr处理,即将所有小写字母,变为大写。"<"后边为已经存在的文件
DIYIHANG
DIERHANG
DISANHANG
DISIHENG
5DIWUHANG6
DI6HANG
[root@localhost mytest]# cat fedora
diyihang
dierhang
disanhang
disiheng
5diwuhang6
di6hang
[root@localhost mytest]# tr -d "hang" < fedora   \\删除fedora中出现的字符串hang,非单词。
diyi
dier
dis
disie
5diwu6
di6
[root@localhost mytest]# tr -d "[[:digit:]]" < fedora
diyihang
dierhang
disanhang
disiheng
diwuhang
dihang
[root@localhost mytest]# tr -d "[0-9]" < fedora
diyihang
dierhang
disanhang
disiheng
diwuhang
dihang
[root@localhost mytest]# ll
总用量 12
-rw-r--r--. 1 root root 0 8月 13 22:54 centos
-rw-r--r--. 1 root root 56 8月 13 23:33 fedora
-rw-r--r--. 1 root root 51 8月 13 23:26 suse
-rw-r--r--. 1 root root 106 8月 13 22:57 ubuntu
[root@localhost mytest]# ll | head -2   \\通过ll命令的输出作为输入交给head -2处理,后者处理后输出到屏幕
总用量 12
-rw-r--r--. 1 root root 0 8月 13 22:54 centos
[root@localhost mytest]# ll | tee suse | head -2   \\将ll命令输出的内容,复制一份到suse,然后继续交由下一个命令处理
总用量 12
-rw-r--r--. 1 root root 0 8月 13 22:54 centos
[root@localhost mytest]# cat suse
总用量 12
-rw-r--r--. 1 root root 0 8月 13 22:54 centos
-rw-r--r--. 1 root root 56 8月 13 23:33 fedora
-rw-r--r--. 1 root root 51 8月 13 23:26 suse
-rw-r--r--. 1 root root 106 8月 13 22:57 ubuntu
[root@localhost mytest]# ls | tee suse | grep centos
centos
[root@localhost mytest]# cat suse
centos
fedora
suse
ubuntu
[root@localhost mytest]# ls fedora | tee -a suse | tr [a-z] [A-Z]    \\此处tr处理的字符是前一个命令的输出通过管道符做为输入交给其处理,tee -a追加到文件。
FEDORA
[root@localhost mytest]# cat suse
centos
fedora
suse
ubuntu
fedora
[root@localhost mytest]#

相关文章

  • Linux之bash

    bash的基础特性之 IO重定向及管理 ] IO重定向: 输入重定向: 管道 bash基础特性之自动补充命令 ba...

  • IO重定向及管道

    1.IO重定向 (1)可用于输入的设备:文件(键盘设备、磁盘、网卡等)(2)可用于输出的设备:文件(显示器、磁盘、...

  • IO重定向及管道

    tr,tee 程序的IO 简单的说程序由指令(命令)和数据(操作对象)组成,在linux上一切皆文件,程序操作对象...

  • Linux系统介绍(四)IO重定向与管道

    IO重定向(IO redirection) Linux的有一个强大之处就是可以通过管道(Pipe)跟IO重定向将一...

  • IO重定向及管道009

    程序=指令+数据 程序的输入流有三种:标准输入流(stdin): 键盘等;标准输出流(stout): 显示器;错误...

  • 第07章重定向管道

    输出重定向案例 > < 脚本中使用重定向 2.输入重定向及结合案例 管道 | 重定向和管道的符号对比。重定向输出到...

  • linux管道及重定向

    一 .管道及重定向 I/O重定向 0, 1, and 2, known as standard input, st...

  • 管道命令

    参考linux shell 管道命令(pipe)使用及与shell重定向区别、管道命令 管道命令操作符是:”|”,...

  • Linux上的文件管理及用户权限管理

    1.bash的基础特性: bash的基础特性:命令的执行状态结果 2.IO重定向及管道 3.目录管理类的命令:mk...

  • 2020-05-21 管道及IO重定向

    计算机的五大构建: 运算器、控制器:CPU 存储器:RAM 输入设备/输出设备 程序:指令和数据构成。...

网友评论

    本文标题:IO重定向及管道

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