Shell(四)從zcat談「流」及檔案描述符

2021-08-31 18:37:01 字數 1129 閱讀 2796

如果有乙個很大的壓縮檔案data.txt.gz,你要計算其第三列的平均值,可以這樣做:

但是,有更好的方法,就是充分利用流(stream)。比如下面這樣:

上面的方法利用zcat命令來生成流,並通過管道(pipe)將流傳輸給awk命令。這樣就避免了解壓檔案的麻煩。並且,利用流往往可以減少記憶體的使用,因為它不用將整個檔案載入到記憶體中

什麼是流?

那什麼是流呢?簡單來說,流的實現就是記憶體裡的一段buffer(緩衝陣列),可以在不同程式/裝置間傳遞資料。正如上面的例子中展示的那樣。

其實,我們經常與流打交道,比如,當你登陸乙個shell時,系統會預設給你開啟三個「流」,分別是標準輸入(流)stdin、標準輸出(流)stdout、標準錯誤(流)stderr,分別用來處理輸入資訊、輸出資訊和錯誤(警告)資訊。而這三個流預設都是與終端裝置連線起來的

比如,當你想要列印(輸出)hello world!這句話時,這幾個字元就通過標準輸出流輸出(顯示)到終端裝置上:

你可以通過「>」符號來改變標準輸出流的去向。比如,你要將hello world! 輸出到test.txt檔案中。你可以這樣:

類似地,你可以通過「2>」符號來改變標準錯誤流的去向,比如這樣:

最後提一句,」>>」符號表示將stdout的內容追加到裝置(檔案)中。」&>」這個符號表示同時改變stdout和stderr的去向。

檔案描述符

那麼,」2>」當中的2代表什麼意思呢?2其實是檔案描述符的意思。即用乙個數字來「代表」乙個流(更準確的說法是檔案指標)。登陸shell時,系統給stdin分配了檔案描述符0,給stdout分配了1,給stderr分配了2。所以,」2>」這個符號就可以改變stderr的去向。

你也可以自己建立檔案描述符。比如,你要交換stdout和stderr所連線的裝置。你可以這樣做:

其中3>&1表示將檔案描述符3指向與檔案描述符1連線的裝置;3>&-表示關閉檔案描述符3。

特殊用法

shell中可以通過

上面

shell指令碼從入門到複雜 其四 陣列

陣列中可以存放多個值。bash shell 只支援一維陣列 不支援多維陣列 陣列元素的下標從0開始。shell 陣列用括號來表示,元素用 空格 符號分割開,語法格式如下 array name value1 valuen 讀取陣列 vi test.sh bin bash array1 a b c d ...

Shell程式設計及常用命令(四) 流程控制

if condition1 then command1 elif condition2 then command2 else commandn fi 例1 if ps ef grep c ssh gt 1 then echo true fi 例2 num1 2 3 num2 1 5 if test ...

從H264 H265碼流中獲取寬 高及幀率

在做碼流分析時,影象解析度 幀率這類的基本資訊,當然不可少。本文介紹如何從nal中計算到影象寬 高,還有解析度。於是h264和h265有相似性,就在一起寫了。寬高可從sps欄位計算得到,公式如下 width pic width in mbs minus1 1 16 height pic height...