2015-02-23 49 views
1

如何過濾管使用的sed

  1. 管的輸出發送到STDOUT 同時
  2. 管的過濾器輸出,並將其寫入到文件

我試圖

cat file | tee | sed 's/abc/def/g' >> log.txt 

我在log.txt中獲得了所需的過濾輸出,但沒有任何內容發送到STDOUT通過tee

+0

'cat file | tee everything.txt | sed's/abc/def/g'>> filtered.txt'。過濾的數據應該轉到「filtered.txt」;未過濾的數據爲「everything.txt」。 – FoggyDay 2015-02-23 04:35:31

+1

'tee'確實將所有內容都發送給它的標準輸出。只是你有'tee'stdout連接到一個管道才能成爲'sed'的標準輸入。 – twalberg 2015-02-23 18:47:52

回答

2

如果目標是要看到在終端上的完整文件而發送所述過濾的文件到log.txt,然後嘗試:

cat file | tee /dev/tty | sed 's/abc/def/g' >> log.txt 

在這種情況下,tee將輸出發送到stdout,在本請轉至sed,並轉至/dev/tty這是您的終端。

或者,如果你有bash或其他高級shell:

cat file | tee >(sed 's/abc/def/g' >> log.txt) 

這裏,tee發送輸出到標準輸出,並且還到在命令行上列出的文件。在上面,我們要求bash從你的sed命令中創建一個類似文件的對象。這是用咒語>(...)完成的,也叫做進程替換。無論發信到那個「文件」,都會顯示爲標準輸入,它會處理它並將其發送到log.txt。另外,tee將寫入stdout,在這種情況下,與上面的第一條命令不同,它是終端。

(我會假設你正在使用cat file一個替身更復雜的指令,而不是作爲一個無用的使用cat。)

1

這可能爲你工作(GNU SED):

sed 's/abc/def/gw fileChanges' <fileIn >fileOut 

這會將更改僅寫入fileChanges,並將原始文件寫入fileOut(如果不提供文件,則將其更改爲stdout)。