《linux命令行大全》讀書筆記 第六章 重定向(IT+Math_complex,追風物以類聚)

《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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章