Linux tee的花式用法和pee
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 e
5个字母分别占用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,它们的结果将出现两个问题:
- 不保证有序性
- 因为跨了命令,交互式模式下(默认标准输出为屏幕)可能会出现命令行隔断的问题(非交互式下不会有问题)
例如:
$ 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相关推荐
- linux命令之tee,技术|为初学者介绍的 Linux tee 命令(6 个例子)
有时候,你会想手动跟踪命令的输出内容,同时又想将输出的内容写入文件,确保之后可以用来参考.如果你想寻找这相关的工具,那么恭喜你,Linux 已经有了一个叫做 tee 的命令可以帮助你. 本教程中,我们 ...
- Linux rm命令、Linux touch命令、Linux tee命令
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Linux rm命令用于删除一个文件或者目录. 语法 rm [options] name...[op ...
- linux tee命令_Linux tee命令示例
linux tee命令 In this article, we shall go through the tee command in Linux. This is commonly used to ...
- linux权限不够tee,Linux Tee命令
Linux tee命令 Linux tee命令与'cat'命令非常相似,只有一个区别.它将stdin放在stdout上,并将它们放入文件中.它是通过管道与其他命令一起使用最多的命令之一.它允许我们编写 ...
- linux tee错误日志,linux tee命令使用详解教程
在执行Linux命令时,我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee命令.接下来是小编为大家收集的linux tee 命令使用详解教程,希望能帮到大家. linux tee ...
- linux tee 命令 输出的同时写入文件
有时候,你会想手动跟踪命令的输出内容,同时又想将输出的内容写入文件,确保之后可以用来参考.如果你想寻找这相关的工具,那么恭喜你,Linux 已经有了一个叫做 tee 的命令可以帮助你. tee 命令基 ...
- linux tee 重定向_快乐的linux命令行-重定向
整理自<快乐的linux命令行一书>. linux系统版本: Ubuntu 17.04 本章,我们将介绍命令行最酷的特性,叫做I/O重定向,通过这个工具,可以重定向命令的输入输出,命令的输 ...
- Linux eBPF:bcc 用法和原理初探之 kprobes 注入
作者简介:Daemon.Wu, Linux 内核性能优化工程师,就职于某微小手机厂从事手机性能优化.座右铭:知行合一. 原创雄文:由泰晓读者投递的各类社区原创好文. 版权声明:本文最先发表于 &quo ...
- linux tee 日志输出_25 个 Linux 下最炫酷又强大的命令行神器,你用过其中哪几个呢?...
众所周知,我们在 Linux 下大多数时候是使用命令行来处理任务的.这样不但操作起来效率比较高,而且界面也比较炫酷.下面,我们就给大家推荐一些不但炫酷又好用的 Linux 命令行神器. 1. exa ...
最新文章
- php柱形图上显示数字怎么改回来,sigmaplot可以在柱状图上显示数值
- ZooKeeper的事务日志和快照
- Qt下使用Shader绘制三角形
- kafka消费中的partition与消费者的关系
- redis linux安装配置,linux下安装配置单点redis
- (27)VHDL实现非(数据流描述)
- 9.6.1 三维数据可视化之曲面图
- 磁盘分区和目录的区别是什么
- 数据挖掘导论——Python练习
- java redis学习记录
- 安装一台RHEL7虚拟机
- 移动端网站优化需要具备哪些条件
- python爬取淘宝数据魔方_看我是怎么使用淘宝数据魔方--巧用数据魔方把握市场信息...
- 百度关键词地区排名查询php源码,百度关键词地区排名查询
- 数字式PID控制MATLAB仿真
- python编写程序输出诗句_python基于词向量的古诗生成器
- Android 获取毫秒时间戳
- 2019-11-29-win10-uwp-如何开始写-uwp-程序
- 加拿大电子计算机工程留学,【加中留学】加拿大计算机工程专业哪些大学比较好...
- 几种方法判断平面点在三角形内
热门文章
- vue项目编写html,从头搭建、编写一个VUE项目
- mysql授权 改表_mysql开启远程登陆(修改数据表和授权两种方法)
- java bip-39_Java中对XML的解析详解
- leetcode204. 计数质数(vip题)
- Ubuntu环境下,使用clion编译器,使用开源opensll的对称AES算法对于文件进行加密,C++代码
- codeforces 50A-C语言解题报告
- 如何控制油门更准确?
- 能让你成为更优秀程序员的10个C语言资源
- 运营商与厂商发力 智能机进入700元以下时代
- 创业必经之路——Paul Graham创业曲线