流 ( Stream )
1. 流,是指可使用的數據元素一個序列。
2. 流,可以想象為是傳送帶上等待加工處理的物品,也可以想象為工廠流水線上的物品。
3. 流,可以是無限的數據。
4. 有一種功能,處理這一個流同時產生着另一個流。這種功能被成為 過濾 ( Filter )。使用管道 ( pipelie ) 將這些功能進行連接。
Unix 管道 ( Pipeline )
1. 管道連接着處理元素,一個處理元素的輸出是下一個處理處理元素的輸入。
2. 管道能加快數據處理速度。
2. Unix 下的管道圖示如下。
舉個例子,列出當前目錄下的所有文件( ls -l ),只保留帶有字符串 key 的文件名( grep key ),並且在滾屏中查看( less )
ls -l | grep key | less
Filter
1. 是指用於處理流的程序。盡管 filter 可以單獨使用,但是他們常常通過管道,組合起來使用。
2. 默認從標准輸入( standard input )獲取數據,寫到標准輸出( standard output )。可以通過輸入操作符 < 改變數據源,通過輸出操作符 > 改變寫入目標,通過追加操作符 >> 追加數據。
3. 通過管道符 | ,鏈接多個 Filter。
4. 例子。從 /etc/passwd 獲取數據,將得到的每一行根據 ":" 進行分割並獲取第一字字段( cut -d : -f 1 /etc/passwd ),提起包含 foo 字符串的行輸出( grep foo )
cut -d : -f 1 /etc/passwd | grep foo
5. 常見的 Filter 程序有:
grep : 從文本數據集中,搜索匹配到的正則表達式的行,一行為單位。
$ cat fruitlist.txt apple apples pineapple apple- apple-fruit fruit-apple banana pear peach orange $ grep apple fruitlist.txt apple apples pineapple apple- apple-fruit fruit-apple
cat : 讀取多個文件,並依次寫入標准輸出。
cat [options] [file_names] > newfile.txt
cut : 提取每一個行的一部分內容作為輸出。較少用,例子略
head : 顯示文本文件內容,或者管道數據中的開頭部分。
head -n 20 filename
tail : 顯示文本文件內容,或者管道數據中的結尾部分。
tail -n 20 filename
sort : 對文本文件內容,或者管道數據進行排序,並輸出。可指定排序列
$ cat zipcode Adam 12345 Bob 34567 Joe 56789 Sam 45678 Wendy 23456 $ sort -k 2n zipcode Adam 12345 Wendy 23456 Bob 34567 Sam 45678 Joe 56789
參考資料