IO重定向及管道

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]#

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容