1.tee多重定向

tee [options] FILE1 FILE2 FILE3...

tee的作用是将一份标准输入多重定向,一份重定向到标准输出/dev/stdout,然后还将标准输入重定向到每个文件FILE中。

例如:

$ cat alpha.log | tee file1 file2 file3 | cat
$ cat alpha.log | tee file1 file2 file3 >/dev/null

上面第一个命令将alpha.log的文件内容重定向给file{1..3}和标准输出通过管道传递给cat;
上面第二个命令将alpha.log的文件内容重定向给file{1..3}和/dev/null。

tee重定向给多个命令

写多了脚本的人可能遇到过这样一种需求:将一份标准输入,重定向到多个命令中去。大概是这样的:

                      | CMD1↗INPUT | tee ↘| CMD2

其实bash自身的特性就能实现这样的需求,通过重定向到子shell中,就能模拟一个文件重定向行为:

cat alpha.txt | tee >(grep -E "a|b") >(grep -E "d|b|c")

(实际上这里的两个>(cmd_list)不是重定向,而是进程替换。命令行解析开始时,将首先进行进程替换,这两个grep将等待标准输入。然后启动cat和tee,然后tee将标准输出交给两个进程的标准输入)

上面的命令将alpha.txt文件内容重定向为3份:一份给第一个grep命令,一份给第二个grep命令,一份给标准输出。假如alpha.txt的内容是a b c d e5个字母分别占用5行(每行一个字母),上面的输出结果如下:

a
b
c
d
e  # 前5行是重定向到/dev/stdout的
a
b  # 这2行是重定向给第一个grep后的执行结果
b
c
d  # 这3行是重定向给第二个grep后的执行结果

如果不想要给标准输出的那份重定向,加上>/dev/null

cat alpha.txt | tee >(grep -E "a|b") >(grep -E "d|b|c") >/dev/null

tee重定向给多个命令时的问题

但是必须注意,tee将数据重定向给不同命令时,这些命令是独立执行的,它们都会各自打开一个属于自己的STDOUT,如果它们都重定向到标准输出,由于涉及到多个不同的/dev/stdout,它们的结果将出现两个问题:

  1. 不保证有序性
  2. 因为跨了命令,交互式模式下(默认标准输出为屏幕)可能会出现命令行隔断的问题(非交互式下不会有问题)

例如:

$ cat alpha.txt | tee >(grep -E "a|b") >(grep -E "d|b|c") >/dev/null
$ a     # 结果直接出现在提示符所在行
b
b
c
d$ cat alpha.txt | tee >(grep -E "a|b") >(grep -E "d|b|c") >/dev/null
b
c      # 这次的结果和上次的顺序不一样
d
a
b

这两个问题,在写脚本过程中必须解决。

对于第二个问题:不同/dev/stdout同时输出时在屏幕上交叉输出的问题,只需将它们再次重定向走即可,这样两份不同的/dev/stdout都再次同时作为一份标准输入:

$ cat alpha.txt | tee >(grep -E "a|b") >(grep -E "d|b|c") >/dev/null | cat

对于第一个问题:不同/dev/stdout同时输出时,输出顺序的随机性,这个没有好方法,只能在各命令行中将各自的结果保存到文件中:

$ cat alpha.txt | tee >(grep -E "a|b" >file1) >(grep -E "d|b|c" >file2) >/dev/null

所以,tee在重定向到多个命令中是有缺陷的,或者说用起来非常不方便,只要将各命令的结果各自保存时,才能一切按照自己的预期进行。那么,pee登场了,多重定向非常好用的一个命令。

2.pee代替tee

pee是moreutils包中的一个小工具,先安装它(epel源中有):

yum -y install moreutils

在man pee中,pee的作用是将标准输入tee给管道。语法:

pee ["cmds"]

不是很好理解,可以通过几个示例直接感受它的用法。

$ cat alpha.txt | pee 'grep -E "a|b"' 'grep -E "d|b|c"'
a
b
b
c
d

所以,它的基本用法是pee "CMD1" "CMD2"

如果想将结果保存到文件,只需加一个命令即可,例如下面的cat >myfile

$ cat alpha.txt | pee 'grep -E "a|b"' 'grep -E "d|b|c"' 'cat >myfile'

和tee有同样的问题,如果各命令都没有指定自己的标准输出重定向,它们将各自打开一个属于自己的/dev/stdout,同样会有多个/dev/stdout同时输出时结果数据顺序随机性的问题,但是不会有多个/dev/stdout同时输出时交互式的隔断性问题,因为pee会收集各个命令的标准输出,然后将收集的结果作为自己的标准输出

pee和tee最大的不同,在于pee将来自多个不同命令的结果作为pee自己的标准输出,所以下面的命令是可以像普通命令一样进行重定向的。

INPUT | pee CMD1 CMD2 >/FILE

而tee则不同,是将cmd1和cmd2的结果放进标准输出(假设各命令自身没有使用重定向),保存到FILE中的是tee读取的标准输入。

INPUT | tee >(cmd1) >(cmd2) >/FILE

所以,想要重定向tee中cmd1和cmd2的总结果,必须使用额外的管道,或者将整个tee放进子shell。

INPUT | tee >(cmd1) >(cmd2) >/dev/null | cat >FILE1
INPUT | ( tee >(cmd1) >(cmd2) >/dev/null ) >/FILE1

Linux tee的花式用法和pee相关推荐

  1. linux命令之tee,技术|为初学者介绍的 Linux tee 命令(6 个例子)

    有时候,你会想手动跟踪命令的输出内容,同时又想将输出的内容写入文件,确保之后可以用来参考.如果你想寻找这相关的工具,那么恭喜你,Linux 已经有了一个叫做 tee 的命令可以帮助你. 本教程中,我们 ...

  2. Linux rm命令、Linux touch命令、Linux tee命令

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Linux rm命令用于删除一个文件或者目录. 语法 rm [options] name...[op ...

  3. linux tee命令_Linux tee命令示例

    linux tee命令 In this article, we shall go through the tee command in Linux. This is commonly used to ...

  4. linux权限不够tee,Linux Tee命令

    Linux tee命令 Linux tee命令与'cat'命令非常相似,只有一个区别.它将stdin放在stdout上,并将它们放入文件中.它是通过管道与其他命令一起使用最多的命令之一.它允许我们编写 ...

  5. linux tee错误日志,linux tee命令使用详解教程

    在执行Linux命令时,我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee命令.接下来是小编为大家收集的linux tee 命令使用详解教程,希望能帮到大家. linux tee ...

  6. linux tee 命令 输出的同时写入文件

    有时候,你会想手动跟踪命令的输出内容,同时又想将输出的内容写入文件,确保之后可以用来参考.如果你想寻找这相关的工具,那么恭喜你,Linux 已经有了一个叫做 tee 的命令可以帮助你. tee 命令基 ...

  7. linux tee 重定向_快乐的linux命令行-重定向

    整理自<快乐的linux命令行一书>. linux系统版本: Ubuntu 17.04 本章,我们将介绍命令行最酷的特性,叫做I/O重定向,通过这个工具,可以重定向命令的输入输出,命令的输 ...

  8. Linux eBPF:bcc 用法和原理初探之 kprobes 注入

    作者简介:Daemon.Wu, Linux 内核性能优化工程师,就职于某微小手机厂从事手机性能优化.座右铭:知行合一. 原创雄文:由泰晓读者投递的各类社区原创好文. 版权声明:本文最先发表于 &quo ...

  9. linux tee 日志输出_25 个 Linux 下最炫酷又强大的命令行神器,你用过其中哪几个呢?...

    众所周知,我们在 Linux 下大多数时候是使用命令行来处理任务的.这样不但操作起来效率比较高,而且界面也比较炫酷.下面,我们就给大家推荐一些不但炫酷又好用的 Linux 命令行神器. 1. exa ...

最新文章

  1. php柱形图上显示数字怎么改回来,sigmaplot可以在柱状图上显示数值
  2. ZooKeeper的事务日志和快照
  3. Qt下使用Shader绘制三角形
  4. kafka消费中的partition与消费者的关系
  5. redis linux安装配置,linux下安装配置单点redis
  6. (27)VHDL实现非(数据流描述)
  7. 9.6.1 三维数据可视化之曲面图
  8. 磁盘分区和目录的区别是什么
  9. 数据挖掘导论——Python练习
  10. java redis学习记录
  11. 安装一台RHEL7虚拟机
  12. 移动端网站优化需要具备哪些条件
  13. python爬取淘宝数据魔方_看我是怎么使用淘宝数据魔方--巧用数据魔方把握市场信息...
  14. 百度关键词地区排名查询php源码,百度关键词地区排名查询
  15. 数字式PID控制MATLAB仿真
  16. python编写程序输出诗句_python基于词向量的古诗生成器
  17. Android 获取毫秒时间戳
  18. 2019-11-29-win10-uwp-如何开始写-uwp-程序
  19. 加拿大电子计算机工程留学,【加中留学】加拿大计算机工程专业哪些大学比较好...
  20. 几种方法判断平面点在三角形内

热门文章

  1. vue项目编写html,从头搭建、编写一个VUE项目
  2. mysql授权 改表_mysql开启远程登陆(修改数据表和授权两种方法)
  3. java bip-39_Java中对XML的解析详解
  4. leetcode204. 计数质数(vip题)
  5. Ubuntu环境下,使用clion编译器,使用开源opensll的对称AES算法对于文件进行加密,C++代码
  6. codeforces 50A-C语言解题报告
  7. 如何控制油门更准确?
  8. 能让你成为更优秀程序员的10个C语言资源
  9. 运营商与厂商发力 智能机进入700元以下时代
  10. 创业必经之路——Paul Graham创业曲线