shell中神奇的管道命令(pipe)

管道,首次看到這個名詞,我並不能將他和os還有shell聯繫到一起。很難想象這麼機械化的一個詞語居然能和編程聯繫起來,而且他還是shell編程中比較重要的一環。
bash命令執行的時候偶輸出的數據會出現。那麼如果這羣數據必須要經過幾道手續才能得到我們想要的格式,此時就要需要用到“|”這個界定符號了。管道命令與連續命令是不一樣的。簡單舉個例子:

ls -al /etc | less

即可利用less的功能,我們就能前後翻動相關的信息了。
整體的管道命令可以用以下這個圖表示:
在這裏插入圖片描述

在每個管道後面接的第一個數據一定是“命令”,而且這個命令必定要能接受STANDARD input的數據纔可以,這樣的命令纔是“管道命令”。例如:less,more,head,tail等纔是可以接受標準輸入的管道命令,而像ls,cp,mv等就不行。
注意

  • 管道命令僅會處理standard input,對於standard error output會予以忽略。
  • 管道命令必須要能接收來自前一個命令的數據成爲standard input 繼續處理才行。

1.選取命令:cut,grep

cut 主要的用途在於將同一行裏面的數據進行分解,最常使用在分析一些數據或文字數據的時候。這是因爲有時候我們會以某些字符當作切割的參數,然後將數據加以切割,以取得我們所需要的數據。不過,cut在處理多空格的相連的數據時會比較吃力一些

cut -d'分隔字符' -ffilelds <==用於分隔字符
cut-c 字符範圍               <==用於排列整齊的信息
export  | cut -c 12-     <==輸出第12字符以後的所有字符
last 

gerp是分析一行信息,若當中有我們需要的信息,就將該行拿出來。
語法

grep [-acinv] [--color=zuto] '查找字符串' filename
-a :將binary文件以text文件的方式查找數據;
-c:計算找到‘查找字符串的次數
-i:忽略大小寫的不同
-n:順便輸出行號
-v:反向選擇,即顯示出沒有‘查找字符串’的那一行
--color=auto:可以將找到的關鍵字部分加上顏色顯示。

2.排序命令:sort,wc,uniq

sort依據不同的數據類型來進行排序。

語法:

sort [-fbMnrtuk] [file or stadin]
參數:
-f;忽略大小寫的差異
-b:忽略最前面的空格符部分
-M:以月份的名字來排序
-n:使用“純數字”進行排序
-r:反向排序;
-u:就是uniq,相同的數據中,僅出現一行代表
-t:分隔符,默認是用【tab】鍵來分隔
-k:以那個區間(field)來進行排序的意思
cat /etc/passwd | sort

uniq

重複的數據僅列出一個

uniq [-ic]
-i:忽略大小寫字符的不同
-c:進行計數

wc

想知道一個文件裏面到底有多少字?多少行?多少字符?就可以使用這個命令。

wc [-lwm]
-l:僅列出行
-w:僅列出多少字
-m:多少字符
如果沒有參數,三個數字代表的是行,字數,字符數

3.雙向重定向:tee

把數據流的處理過程中將某段信息存下來,如圖:
tee

tee [-a] file 
-a 以累加的方式,將數據加入到file中

字符轉換命令:tr,col,join,paste,expand

tr

可以用來刪除一段信息當中的文字,或者是進行文字信息的替換

tr [-ds]set1...
參數:
-d:刪除信息中的set1這個字符串
-s:替換掉重複的字符
不加參數是替換

這個命令可以寫在正則表達式中。

col

col [-xb]
參數:
-x:將tab鍵轉換成對等的空格鍵
-b:將文字內有反斜槓(/)時,僅保留反斜槓最後接的那個字符

col經常被利用於將man page 轉存爲純文本文件以方便查閱的功能

join

主要是將兩個文件當中的有相同數據的那一行加在一起。

join [-ti12] file1 file2
參數:
-t:join默認以空格符分隔數據,並且對比“第一個字段”的數據,如果兩個文件相同,則將兩條數據連成一行,且第一個字段放在第一個
-i:忽略大小寫
-1:代表第一個文件要用哪個字段來分析的意思
-2:代表第二個文件要用哪個字段來分析的意思

注意
在使用join之前,你所需要處理的文件應該要事先經過排序(sort)處理

paste

相對與join必須要對比兩個文件的數據相關性,paste就直接將兩行貼在一起,且中間以【
tab】鍵隔開而已

paste [-d] file1 file2
參數:
-d:後面可以接分隔字符,默認是以[tab]來分隔的
- :如果file部分寫成- ,表示來自standard input的數據的意思

expand

將tab轉換成空格鍵

expand [-t] file 
參數:
-t:後面可以接數字,一般來說,一個tab鍵可以用8個空格鍵代替,我們也可以自行定義一個tab鍵代表多少個空格。

切割命令:spilt

spilt [-bl] file PREFIX
參數:
-b:後面可接切割成的文件的大小,可加單位,例如b,k,m等。
-l:以行數來進行切割。
PREFIX:代表前導符,可作爲切割文件的前導文字

參數代換:xargs

產生某個命令的參數的意思

xargs [-0epn] command
參數:
-0:如果輸入的stdin含有特殊字符,例如`,\,空格鍵等字符時,這個參數可以將它還原成一般字符,這個參數可以用於特殊狀態。
-e:這個是EOF(end of file)的意思。後面可以接一個字符串,當xargs分析到這個字符串時,就會停止繼續工作。
-p:在執行每個命令的參數時,都會詢問用戶的意思。
-n:後面接 次數,每次command命令執行時,要使用幾個參數的意思。
  • 使用xargs的原因是,很多命令不支持管道命令,我們可以通過xargs來提供該命令引用standard input之用。

減號“-”的作用

tar -cvf - /home |tar -xvf -

這個例子的意思是將/home裏面的文件打包,但打包的數據不是記錄到文件,而是傳送到stdout;經過管道後,將tar-cvf-/home傳送給後面的tar-xvf-。後面的這個-則是取用前一個命令的stdout,因此我們就不需要使用文件了。

發佈了107 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章