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.pswp.cn/news/450526.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450526.shtml
英文地址,請注明出處:http://en.pswp.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;就看忽略的檢查是否…