我發現自己經常使用linux shell命令(例如grep
,sed
和awk
)來格式化/過濾/轉發東西,使其更加可用。如何讓管道上的輸入等待輸入結束?
「源」數據通常是進程的輸出或本地文件的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步沒有開銷」的方式...
你加你是如何 「複製」 的數據?直接管道輸出,包括捕獲文件(你知道你可以重定向stdin,或者對於大多數命令在命令行上列出文件,對嗎?)不應該有你看到的問題。 – mpez0
如果我理解你的問題,你可以使用shell'here'文件來做到這一點。 'awk'.... << EOD dataline1 dataline2 datalineN EOD'你在'awk'....'<<'中輸入的地方....然後粘貼你的數據,在單獨的行中輸入'EOD'。你的輸出會出現,輸入在上面的屏幕上。祝你好運。 – shellter
當我在這樣的命令行中輸入時,我喜歡立即反饋。如果交錯輸出無用,則意味着它將進入文件或管道,交錯並不是問題。粗略地說,在我輸入數據的那些(相當少見的)場合,直接吞吐量是一個好處。使用命令來緩衝輸入的副本是合理的。我注意到'sort'是一個命令,它在生成任何輸出之前必須讀取其所有輸入。然而,「排序」通常不適合的其他原因(例如重排數據的事實)。 –