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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[CF893F]Subtree Minimum Query

题目大意: 给你一颗有根树,点有权值,m次询问,每次问你某个点的子树中距离其不超过k的点的权值的最小值。(边权均为1,点权有可能重复,k值每次询问有可能不同,强制在线) 做…

mac电脑快捷键(持续更新)

1、快速查找软件 commandspace 2、显示/隐藏文件夹 shiftcmmand. 3、路径输入 commandshiftg 4、快速打开软件 commandtab 5、截图 commandshift3 commandshift4 6、注销 Command-Shift-Q 7、强制注销 ommand-Shift-Option-Q 8、睡眠 controlshift电源键 9、选…

C语言typedef关键字—伟大的缝纫师

关于马甲的笑话。有这样一个笑话:一个猎人在河边抓捕一条蛇,蛇逃进了水里。过一会,一个乌龟爬到岸边。猎人一把抓住这个乌龟,大声的说道:小样,别你为你穿了个马甲我就不认识你了!typedef 关键字…

将网桥的配置写进去/etc/sysconfig/network-scripts/ifcfg-xxx

有时候需要使用网桥命令比如brctl设置一些网桥的属性,而这些方式能否同样写进去配置文件使其永久开机生效。 答案是不行的,也同样找过Ubuntu的,其实Ubuntu可以实现,参考:http://manpages.ubuntu.com/manpages/cosmic/m…

phpstorm如何回滚。并取消本地提交

1、现在我提交到本地 当前git版本为4b53dca9 上一版本为965cdf14 2、现在执行回滚操作,取消本地提交 版本复制到这里,点击reset就会回滚了 如需使用git命令操作,请参考链接https://blog.csdn.net/qq_35774849/article/details/107313193

windows server 2008 R2 x64 基础知识(2)

一、防火墙设置 1.windows防火墙的种类: 1)工作组网络环境 2)域网络环境 2.防火墙的配置 1)打开管理工具:win->管理工具->高级安全windows防火墙 2)管理配置: (1)防火墙的数据流类型 a.入站流量:外部访问内部分流量 b…

SOA 说明,解析

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一直对SOA这个概念不甚明了,再度记录下: 一、是一个面向服务的架构,是一种思想、规则。而不是一个确…

Windows API 第二篇 SHGetSpecialFolderPath

BOOL SHGetSpecialFolderPath( HWND hwndOwner, LPTSTR lpszPath, int nFolder, BOOL fCreate ); 参数解释: hwndOwner:Handle to the owner wind…

面向对象—的__new__()方法详解

[Python] Python 之 __new__() 方法与实例化 __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() 启动之前&#…

git使用回滚,清除暂缓区,解决冲突(持续更新)

1、git restore --staged <文件> 清除暂缓区文件名 2、git reset --hard <版本号> 回滚到上一版本 如看PHPstrom如何操作请参考https://blog.csdn.net/qq_35774849/article/details/107312658 3、解决冲突 &#xff08;1&#xff09;使用默认的解决冲突 打开…

14.安全

1.基本概念 安全问题的产生&#xff1a; 互联网作为商业交易的工具快速发展&#xff0c;越来越多的公司提供网络交易服务。很多商业活动在网上进行当前&#xff0c;成千上万的网民在网上进行各种活动的同时&#xff0c;也在网上传递其个人信息每天在网上发生各种各样的商业活动…

C语言enum关键字

很多初学者对枚举(enum)感到迷惑&#xff0c;或者认为没什么用&#xff0c;其实枚举(enum)是个很有用的数据类型。一、枚举类型的使用方法 一般的定义方式如下&#xff1a;enum enum_type_name{ENUM_CONST_1,ENUM_CONST_2,...ENUM_CONST_n} enum_variable_name;注意&#xff1a…

Dubbo 需求、架构、使用Demo

只是整理下方便自己记录 内容全部来自官网&#xff1a;http://dubbo.io/books/dubbo-user-book/preface/usage.html 一、需求 在大规模服务化之前&#xff0c;应用可能只是通过 RMI 或 Hessian 等工具&#xff0c;简单的暴露和引用远程服务&#xff0c;通过配置服务的URL地址进…

Ubuntu安装之python开发

Ubuntu安装之python开发 什么&#xff1f;&#xff1f;Ubuntu(乌班图)开发&#xff1f;不会用&#xff1f;&#xff1f;怎么进行python开发&#xff1f;&#xff1f;&#xff1f; 乌班图操作系统下载地址&#xff1a;http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-…

vimdiff和vim-fugitive安装,使用教程

1、vimdiff的安装 在终端执行 git config --global merge.tool vimdiff git config --global merge.conflictstyle diff3 git config --global mergetool.prompt false git config --global diff.tool vimdiff git config --global difftool.prompt false git config --…

在 PowerPoint 2016 中嵌入网页

之前在智图这个网站上做了一张地图&#xff0c;在嵌入 PPT 里面的时候碰到了一些问题&#xff0c;现在把找到的解决方法写下来。 PPT 里面自带的 WebBrowser 控件可以实现网页浏览的功能。在“开发工具”选项卡下的“其他控件”中找到“Microsoft Web Browser”&#xff0c;在画…

js 正则表达式 整合

正则表达式:断言 取字符串区间: /(?<[" star "]).*(?[" end "])/// 简单封装 Vue.prototype.strMatch (str,star,end) > { let regs new RegExp("(?<[" star "]).*(?[" end "])"); let req str…

dubbo 注册中心zookeeper 手册

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 zookeeper 注册中心 Zookeeper 是 Apacahe Hadoop 的子项目&#xff0c;是一个树型的目录服务&#xff0c;支持变更推送&#xff0c;适…

数组 深入详解

再论C语言数组 C语言处理数组的方式是它广受欢迎的原因之一。C语言对数组的处理是非常有效的&#xff0c;其原因有以下三点&#xff1a;第一&#xff0c;除少数翻译器出于谨慎会作一些繁琐的规定外&#xff0c;C语言的数组下标是在一个很低的层次上处理的。但这个优点也有一个反…

oracle ins-30131错误

打开cmd 但是在我的环境没效果&#xff0c;而我已知临时目录没有问题。那么在命令行进入安装软件目录&#xff0c;通过命令行启动安装程序&#xff0c;设置 ignorePrereq 检查&#xff0c;此时数据库软件可以启动安装&#xff0c;是否会出现错误&#xff0c;就看忽略的检查是否…