Linux tee的花式用法和pee
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/nulltee重定向給多個(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)題:
例如:
$ 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)題。
- 上一篇: 中虚数怎么表示_英文论文写作中的常见错误
- 下一篇: linux 其他常用命令