2014-05-16 76 views
1

我發現自己經常使用linux shell命令(例如grep,sedawk)來格式化/過濾/轉發東西,使其更加可用。如何讓管道上的輸入等待輸入結束?

「源」數據通常是進程的輸出或本地文件的cat

隨着我越來越流利的命令,我發現自己越來越多地使用它們。我以前用記事本++正則表達式搜索&替換之前我現在知道如何在我的shell中「即時」執行操作。

我現在遇到的「問題」是如何處理我從另一個源「複製」的數據,我想通過stdin直接向shell提供數據,而我只希望看到輸出標準輸出。我遇到的問題是輸入和輸出存在「十字交叉」。例如:

>awk '$1 == "true" {print $2}' 
true Paul 
Paul 
false John   
true Janice 
Janice 

問題是這對我不適用。我需要輸出清楚地與輸入分離。之後它可能會出現,或者我根本不想看到stdin。

我們該怎麼做?我發現我可以使用tail「持有」的輸入數據,直到這一切都被餵養:

tail -n 999 | awk '$1 == "true" {print $2}' 
true Paul 
false John 
true Janice 
Paul 
Janice 

這個工作,但有點累贅。

是否有任何內置命令基本上「持有」流,直到它結束(或者說,直到所有輸入已被處理,纔打印任何東西)?或者簡單地壓制看到stdin的方法?我也可以使用臨時文件,但我希望有一個「乾淨的1步沒有開銷」的方式...

+0

你加你是如何 「複製」 的數據?直接管道輸出,包括捕獲文件(你知道你可以重定向stdin,或者對於大多數命令在命令行上列出文件,對嗎?)不應該有你看到的問題。 – mpez0

+5

如果我理解你的問題,你可以使用shell'here'文件來做到這一點。 'awk'.... << EOD dataline1 dataline2 datalineN EOD'你在'awk'....'<<'中輸入的地方....然後粘貼你的數據,在單獨的行中輸入'EOD'。你的輸出會出現,輸入在上面的屏幕上。祝你好運。 – shellter

+0

當我在這樣的命令行中輸入時,我喜歡立即反饋。如果交錯輸出無用,則意味着它將進入文件或管道,交錯並不是問題。粗略地說,在我輸入數據的那些(相當少見的)場合,直接吞吐量是一個好處。使用命令來緩衝輸入的副本是合理的。我注意到'sort'是一個命令,它在生成任何輸出之前必須讀取其所有輸入。然而,「排序」通常不適合的其他原因(例如重排數據的事實)。 –

回答

2

我不知道任何這樣的命令,但你可以輕鬆地添加自己的在.bashrc

waiting() { 
    printf "%s\n" "$(cat)" 
} 

然後

awk '$1 == "true" {print $2}' | waiting 

當然,你可以也把waiting第一,如果你喜歡。

+0

似乎正是我所要求的。我不確定它是如何工作的,但我會接受:) –

3
awk '$1 == "true" {print $2}' | tac | tac 

awk '$1 == "true" {print $2}' > /tmp/file.txt; cat /tmp/file.txt 
+0

不錯,我不知道「tac」命令。這種解決方案類似於「尾巴」技巧,但(可以說)更清潔。我也喜歡它,因爲你可以很容易'別名tacat ='tac | tac' –