《linux命令行大全》讀書筆記 第六章 重定向http://blog.csdn.net/dyx404514/article/details/41357869
第六章 重定向
本章討論的話題是命令行中相當重要的一部分——I/O重定向,這個功能可以把命令行中的輸入重定向爲文件中的內容,也可將命令行的輸出結果重定向到文件中,甚至可以將一個命令的輸出成爲另一個命令的輸入,如果將多個命令關聯起來,將會形成一個非常強大的命令——管道。
本章涉及相關命令:
cat: 合併文件
sort:對文本進行排序
uniq:報告文件或刪除文件中重複的行。
wc:打印文件中的換行符,字,和字節的個數
grep:打印匹配行。
head和tail:輸出文件的第一部分和最後一部分的內容。
tee:讀取標準輸入的數據,並將其內容輸出到標準輸出和文件中。
一:標準輸入,標準輸出和標準錯誤
STDIN 0 鍵盤輸入
STDOUT 1 輸出信息到提示符窗口
STDERR 2 輸出錯誤信息到提示符窗口
前面幾張我們運行的命令的輸入輸出都是使用的標準輸入輸出,從鍵盤輸入數據,然後輸出數據到終端中。使用重定向功能可以改變這個慣例。
1:標準輸入重定向。
標準輸出重定向符號:>
格式:commad > filename
將命令的輸出輸出到filename文件中,可看下面的例子:
在終端運行命令 ls -a ,這時沒用用重定向,輸出到終端中,接下來用重定向功能將 ls -a的輸出重定向到 dd.txt中(如果不存在則創建),則dd.txt中的內容如下所示:
需要注意的一點是:>重定向符只是將標準輸出重定向到文件dd.txt中,如果命令發生錯誤,則錯誤信息並不會重定向到文件中,而是輸出到終端,比如前面的例子,ls -a /usr/ddyyxx > dd.txt 假設/usr/ddyyxx不存在,則在終端中會輸出錯誤信息。
並且這個時候可以發現dd.txt中的內容爲空。因爲使用重定向符“>”時,目的文件會從文件開頭部分重新改寫,並且覆蓋之前的內容。
由於前面這個命令什麼也沒輸出,那麼輸出就是0,則會將目標文件清空。
如果想要使目標文件從文件末尾開始改寫,應該使用重定向符號“>>”,這樣就不會覆蓋之前的內容了。
另外一個小技巧就是:如果想要新建一個空文件或者刪除一個文件的文件內容,可以使用下面的方式:
> filename
僅僅使用重定向符號,之前什麼命令也不加,就可以達到目的。
2:標準錯誤成重定向:
標準錯誤的重定向並不能簡單地使用一個一個專有重定向符實現。
要實現標準錯誤的重定向,先要了解文件描述符。
當某個程序打開文件時,操作系統返回相應的文件描述符,程序爲了處理該文件必須引用此描述符。所謂的文件描述符是一個低級的正整數。最前面的三個文件描述符(0,1,2)分別與標準輸入(stdin),標準輸出(stdout)和標準錯誤(stderr)對應。
由於標準錯誤等同與文件描述符2,所以可以用下面的方法重定向標準錯誤。
ls -a /usr/ddyyxx 2> error.txt
其中文件描述符“2”緊放在重定向符之前,將標準錯誤重定向到error.txt中。
另外:如果想將標準輸出和標準錯誤同時重定向到同一文件,可以用 &>符號即可。
3:標準輸入重定向
標準輸入重定向符爲“<”,和標準輸出重定向格式類似,即將文件中的內容作爲命令的輸入。只作用於可以接受標準輸入的命令。這裏不再詳細說明。
二:管道
管道比重定向使用得更加廣泛。命令從標準輸入讀取數據,並將數據發送到標準輸出的能力,就是使用了名爲管道的特性。
管道的操作符位“|”(豎線)。可以將一個命令的標準輸出傳送到另一個命令的標準輸入中。
commad1 | commad2
如前面介紹過得的less命令,使用ls -a /usr less命令,可以得到如下結果:
管道功能可以對數據進行復雜的操作,可將多個命令合在一起構成一個管道。下面先介紹一些命令,再將它們與管道結合起來形成一個可完成複雜功能的命令。
1:cat命令:
cat命令的用途是連接文件或標準輸入並打印。這個命令常用來顯示文件內容,或者將幾個文件連接起來顯示,或者從標準輸入讀取內容並顯示,它常與重定向符號配合使用。
命令格式:
cat [選項] [文件]...
命令功能:
cat主要有三大功能:
1). 一次顯示整個文件:cat filename
2). 從鍵盤創建一個文件:cat > filename 只能創建新文件,不能編輯已有文件.
3). 將幾個文件合併爲一個文件:cat file1 file2 > file
關於cat命令的詳細描述,可參考這篇文章:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html
2: wc
(1)命令格式:
wc [選項]文件...
(2)命令功能:
統計指定文件中的字節數、字數、行數,並將統計結果顯示輸出。該命令統計指定文件中的字節數、字數、行數。如果沒有給出文件名,則從標準輸入讀取。wc同時也給出所指定文件的總統計數。
(3) 命令參數:-c 統計字節數。
-l 統計行數。
-m 統計字符數。這個標誌不能與 -c 標誌一起使用。
-w 統計字數。一個字被定義爲由空白、跳格或換行字符分隔的字符串。
-L 打印最長行的長度。
-help 顯示幫助信息
--version 顯示版本信息
3:sort
sort命令可以對一個文件中的文本行進行排序,它的功能相當強大,可以根據選項對文本使用不同優先級或標準的排序操作。
格式:sort [選項] 文件...
-b 忽略每行前面開始出的空格字符。
-d 排序時,處理英文字母、數字及空格字符外,忽略其他的字符。
-f 排序時,將小寫字母視爲大寫字母。
-i 排序時,除了040至176之間的ASCII字符外,忽略其他的字符。
-c 檢查文件是否已經按照順序排序。
-m 將幾個排序好的文件進行合併。
-M 前面3個字母依照月份的縮寫進行排序。
-n 依照數值的大小排序。
-o<輸出文件> 將排序後的結果存入指定的文件。
-r 以相反的順序來排序。
-t<分隔字符> 指定排序時所用的欄位分隔字符。
-k 指定域
--help 顯示幫助。
--version 顯示版本信息。
關於sort命令的詳細描述,可參考手冊或者這篇文章:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html
4:uniq
uniq命令經常和sort命令一起使用,功能是對已經排序好的數據列表,去除所有重複的行。
格式: uniq [選項] 文件
說明:這個命令讀取輸入文件,並比較相鄰的行。在正常情況下,第二個及以後更多個重複行將被刪去,行比較是根據所用字符集的排序序列進行的。該命令加工後的結果寫到輸出文件中。輸入文件和輸出文件必須不同。如果輸入文件用“- ”表示,則從標準輸入讀取。
該命令各選項含義如下:
– c 顯示輸出中,在每行行首加上本行在文件中出現的次數。它可取代- u和- d選項。
– d 只顯示重複行。
– u 只顯示文件中不重複的各行。
– n 前n個字段與每個字段前的空白一起被忽略。一個字段是一個非空格、非製表符的字符串,彼此由製表符和空格隔開(字段從0開始編號)。
+n 前n個字符被忽略,之前的字符被跳過(字符從0開始編號)。
– f n 與- n相同,這裏n是字段數。
– s n 與+n相同,這裏n是字符數。
關於uniq命令的詳細描述和實例可以參考:http://os.51cto.com/art/201107/274991.htm
5:grep
Linux系統中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹 配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是所有用戶。
grep的工作方式是這樣的,它在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板後的所有字符串被看作文件名。搜索的結果被送到標準輸出,不影響原文件內容。
grep可用於shell腳本,因爲grep通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。
1.命令格式:
grep [選項] 模式 文件
2.命令功能:
用於過濾/搜索的特定字符。可使用正則表達式能多種命令配合使用,使用上十分靈活。
關於grep命令的詳細描述可參考:http://www.cnblogs.com/peida/archive/2012/12/17/2821195.html
6:tee
tee命令讀取標準輸入,再把讀到的內容複製到標準輸出和一個或更多的文件中去,形象一點的描述就是在管道中安裝了一個“T”。
tee命令在某個中間階段捕獲管道中的內容時會非常有用。
tee [選項] [文件]
描述:
將標準輸入複製到每個指定的文件中,也輸出到標準輸出上
選項:
-a 不覆蓋,而是追加輸出到指定的文件中
-i 忽略中斷信息
--help: 顯示幫助信息並退出
--version: 顯示版本信息並退出
若指定的輸出文件爲'-',則再次輸出到標準輸出上
下面介紹管道的用法。
前面說過,管道的作用是將一個命令的輸出發送到另一個命令的輸入,用重定向同樣可以做到這一點:
commad1 > file.txt
commad2 < file.txt
但是這樣不僅很笨拙,而且還增加了中間文件。
使用管道能夠實時地將一個命令的輸出傳送到另一個命令的輸入,而不是要等第一個命令完成後,再將輸出傳送個下一個命令。
接下來舉一些例子來介紹管道的使用方式:
(1):去除命令輸出中重複的行,可以用下面的命令
commad | sort | uniq | less
將命令的輸出排序後,再去重,再將剩下的輸出傳送到less命令中。
(2):打印輸出內容中的行數,字數,和字節數
commad | wc
我們也可將管道和重定向一起使用,如下
commad | wc > out.txt
(3)搜索歷史目錄中包含關鍵字的內容
commad | grep pattern
上面只是管道的基本用法,有關管道更加詳細的介紹和實例分析可以參考這篇文章
http://www.cnblogs.com/chengmo/archive/2010/10/21/1856577.html