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

上面的命令将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

原文地址:https://www.cnblogs.com/f-ck-need-u/p/9749882.html

时间: 2024-10-24 08:48:24

Linux tee的花式用法和pee的相关文章

linux tee

tee 功能说明:读取标准输入的数据,并将其内容输出成文件. 语 法:tee [-ai][--help][--version][文件...] 补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件. 参 数: -a或--append 附加到既有文件的后面,而非覆盖它. -i-i或--ignore-interrupts 忽略中断信号. --help 在线帮助. --version 显示版本信息. 将内容同时保存到多个文件: echo hello | tee a b

linux tee命令

syntax:tee [OPTION]... [FILE]... description:Copy standard input to each FILE, and also to standard output. -a:append to the given FILEs, do not overwrite:

linux中sudo的用法和sudoers配置详解

摘自:http://zxf261.blog.51cto.com/701797/748756 sudo 是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等.这样不仅减少了root用户的登陆和管理时间,同样也提高了安全性.Sudo不是对shell的一个代替,它是面向每个命令的.它的特性主要有这样几点:1.sudo能够限制用户只在某台主机上运行某些命令.2.sudo提供了丰富的日志,详细地记录了每个用户干了

linux tee 命令详解

功能说明:读取标准输入的数据,并将其内容输出成文件. 语 法:tee [-ai][--help][--version][文件...] 补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件. 参 数:-a或--append 附加到既有文件的后面,而非覆盖它.-i-i或--ignore-interrupts 忽略中断信号.--help 在线帮助.--version 显示版本信息. 

Linux tee命令使用详解分享

tee命令主要被用来向standout(标准输出流,通常是命令执行窗口)输出的同时也将内容输出到文件,下面是tee的man 信息 read from standard input and write to standard output and files 下面我们通过几个应用场景来熟悉tee命令. 场景1: 如何使用tee命令(http://jlyy0831.com) tee命令格式是: 1.tee [OPTION]... [FILE]... 从man文件的定义了解 tee从标准输入流读取数据

Linux的nohup和&用法和区别

nohup和&的区别 &:后台运行,但当用户退出(挂起)的时候,命令自动也跟着退出 什么意思呢? 意思是说, 当你在执行 Command & 的时候, 即使你用ctrl C, 那么a.out照样运行(因为对SIGINT信号免疫). 但是要注意, 如果你直接关掉shell后, 那么, 这个Command进程同样消失. 可见, &的后台并不硬(因为对SIGHUP信号不免疫). nohup: 即no hang up,不挂断的运行 nohup的意思是忽略SIGHUP信号, 所以当运

Linux命令——tee

转自:Linux tee Command Explained for Beginners (6 Examples) 8 Linux Tee Command with Examples 国内已有人翻译此文:为初学者介绍的 Linux tee 命令(6 个例子) 简介 有时候,你会想手动跟踪命令的输出内容,同时又想将输出的内容写入文件,确保之后可以用来参考.如果你想寻找这相关的工具,那么恭喜你,Linux 已经有了一个叫做 tee 的命令可以帮助你.tee命令读入标准输入,并写到标准输出和文件(一个

linux中的分段和分页

觉得这篇文章写分段和分页机制还是挺清晰的,在此转载一下. 前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识. 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的技术所存在的哪些问题.弄清楚了这些,我们才能比较清晰的把握某

Linux中的内存管理(转)

原文:http://blog.chinaunix.net/uid-26611383-id-3761754.html 前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识. 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的技