日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux tee的花式用法和pee

發(fā)布時(shí)間:2023/12/19 linux 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux tee的花式用法和pee 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.tee多重定向

tee [options] FILE1 FILE2 FILE3...

tee的作用是將一份標(biāo)準(zhǔn)輸入多重定向,一份重定向到標(biāo)準(zhǔn)輸出/dev/stdout,然后還將標(biāo)準(zhǔn)輸入重定向到每個(gè)文件FILE中。

例如:

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

上面第一個(gè)命令將alpha.log的文件內(nèi)容重定向給file{1..3}和標(biāo)準(zhǔn)輸出通過(guò)管道傳遞給cat;
上面第二個(gè)命令將alpha.log的文件內(nèi)容重定向給file{1..3}和/dev/null。

tee重定向給多個(gè)命令

寫(xiě)多了腳本的人可能遇到過(guò)這樣一種需求:將一份標(biāo)準(zhǔn)輸入,重定向到多個(gè)命令中去。大概是這樣的:

| CMD1↗INPUT | tee ↘| CMD2

其實(shí)bash自身的特性就能實(shí)現(xiàn)這樣的需求,通過(guò)重定向到子shell中,就能模擬一個(gè)文件重定向行為:

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

(實(shí)際上這里的兩個(gè)>(cmd_list)不是重定向,而是進(jìn)程替換。命令行解析開(kāi)始時(shí),將首先進(jìn)行進(jìn)程替換,這兩個(gè)grep將等待標(biāo)準(zhǔn)輸入。然后啟動(dòng)cat和tee,然后tee將標(biāo)準(zhǔn)輸出交給兩個(gè)進(jìn)程的標(biāo)準(zhǔn)輸入)

上面的命令將alpha.txt文件內(nèi)容重定向?yàn)?份:一份給第一個(gè)grep命令,一份給第二個(gè)grep命令,一份給標(biāo)準(zhǔn)輸出。假如alpha.txt的內(nèi)容是a b c d e5個(gè)字母分別占用5行(每行一個(gè)字母),上面的輸出結(jié)果如下:

a b c d e # 前5行是重定向到/dev/stdout的 a b # 這2行是重定向給第一個(gè)grep后的執(zhí)行結(jié)果 b c d # 這3行是重定向給第二個(gè)grep后的執(zhí)行結(jié)果

如果不想要給標(biāo)準(zhǔn)輸出的那份重定向,加上>/dev/null:

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

tee重定向給多個(gè)命令時(shí)的問(wèn)題

但是必須注意,tee將數(shù)據(jù)重定向給不同命令時(shí),這些命令是獨(dú)立執(zhí)行的,它們都會(huì)各自打開(kāi)一個(gè)屬于自己的STDOUT,如果它們都重定向到標(biāo)準(zhǔn)輸出,由于涉及到多個(gè)不同的/dev/stdout,它們的結(jié)果將出現(xiàn)兩個(gè)問(wèn)題:

  • 不保證有序性
  • 因?yàn)榭缌嗣?#xff0c;交互式模式下(默認(rèn)標(biāo)準(zhǔn)輸出為屏幕)可能會(huì)出現(xiàn)命令行隔斷的問(wèn)題(非交互式下不會(huì)有問(wèn)題)
  • 例如:

    $ cat alpha.txt | tee >(grep -E "a|b") >(grep -E "d|b|c") >/dev/null $ a # 結(jié)果直接出現(xiàn)在提示符所在行 b b c d$ cat alpha.txt | tee >(grep -E "a|b") >(grep -E "d|b|c") >/dev/null b c # 這次的結(jié)果和上次的順序不一樣 d a b

    這兩個(gè)問(wèn)題,在寫(xiě)腳本過(guò)程中必須解決。

    對(duì)于第二個(gè)問(wèn)題:不同/dev/stdout同時(shí)輸出時(shí)在屏幕上交叉輸出的問(wèn)題,只需將它們?cè)俅沃囟ㄏ蜃呒纯?#xff0c;這樣兩份不同的/dev/stdout都再次同時(shí)作為一份標(biāo)準(zhǔn)輸入:

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

    對(duì)于第一個(gè)問(wèn)題:不同/dev/stdout同時(shí)輸出時(shí),輸出順序的隨機(jī)性,這個(gè)沒(méi)有好方法,只能在各命令行中將各自的結(jié)果保存到文件中:

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

    所以,tee在重定向到多個(gè)命令中是有缺陷的,或者說(shuō)用起來(lái)非常不方便,只要將各命令的結(jié)果各自保存時(shí),才能一切按照自己的預(yù)期進(jìn)行。那么,pee登場(chǎng)了,多重定向非常好用的一個(gè)命令。

    2.pee代替tee

    pee是moreutils包中的一個(gè)小工具,先安裝它(epel源中有):

    yum -y install moreutils

    在man pee中,pee的作用是將標(biāo)準(zhǔn)輸入tee給管道。語(yǔ)法:

    pee ["cmds"]

    不是很好理解,可以通過(guò)幾個(gè)示例直接感受它的用法。

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

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

    如果想將結(jié)果保存到文件,只需加一個(gè)命令即可,例如下面的cat >myfile。

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

    和tee有同樣的問(wèn)題,如果各命令都沒(méi)有指定自己的標(biāo)準(zhǔn)輸出重定向,它們將各自打開(kāi)一個(gè)屬于自己的/dev/stdout,同樣會(huì)有多個(gè)/dev/stdout同時(shí)輸出時(shí)結(jié)果數(shù)據(jù)順序隨機(jī)性的問(wèn)題,但是不會(huì)有多個(gè)/dev/stdout同時(shí)輸出時(shí)交互式的隔斷性問(wèn)題,因?yàn)?strong>pee會(huì)收集各個(gè)命令的標(biāo)準(zhǔn)輸出,然后將收集的結(jié)果作為自己的標(biāo)準(zhǔn)輸出。

    pee和tee最大的不同,在于pee將來(lái)自多個(gè)不同命令的結(jié)果作為pee自己的標(biāo)準(zhǔn)輸出,所以下面的命令是可以像普通命令一樣進(jìn)行重定向的。

    INPUT | pee CMD1 CMD2 >/FILE

    而tee則不同,是將cmd1和cmd2的結(jié)果放進(jìn)標(biāo)準(zhǔn)輸出(假設(shè)各命令自身沒(méi)有使用重定向),保存到FILE中的是tee讀取的標(biāo)準(zhǔn)輸入。

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

    所以,想要重定向tee中cmd1和cmd2的總結(jié)果,必須使用額外的管道,或者將整個(gè)tee放進(jìn)子shell。

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

    總結(jié)

    以上是生活随笔為你收集整理的Linux tee的花式用法和pee的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。