Linux強大的IO重新導向和管道功能(內含命令替換,執行個體:大量刪除檔案)

來源:互聯網
上載者:User

1. 標準輸入與輸出

  我們知道,執行一個shell命令列時通常會自動開啟三個標準檔案,即標準輸入檔案(stdin),通常對應終 端的鍵盤;標準輸出檔案(stdout)和標準錯誤輸出檔案(stderr),這兩個檔案都對應終端的螢幕。進程將從標準輸入檔案中得到輸入資料,將正常 輸出資料輸出到標準輸出檔案,而將錯誤資訊送到標準錯誤檔案中。

  我們以cat命令為例,cat命令的功能是從命令列給出的檔案中讀取資料,並將這些資料直接送到標準輸出。若使用如下命令:

  $ cat config

  將會把檔案config的內容依次顯示到螢幕上。但是,如果cat的命令列中沒有參數,它就會從標準輸入中讀取資料,並將其送到標準輸出,直到ctrl+D(終結輸入)或者ctrl+c(終結進程)。例如:

  $ cat

  Hello world

  Hello world

  Bye

  Bye

  $

  使用者輸入的每一行都立刻被cat命令輸出到螢幕上。

  另一個例子,命令sort按行讀入檔案本文(當命令列中沒有給出檔案名稱時,表示從標準輸入讀入),將其排序,並將結果送到標準輸出。下面的例子是從標準輸入讀入一個採購單,並將其排序。

  $ sort

  bananas

  carrots

  apples

  apples

  bananas

  carrots

  $

  這時我們在螢幕上得到了已排序的採購單。

  直接使用標準輸入/輸出檔案存在以下問題:

  輸入資料從終端輸入時,使用者費了半天勁輸入的資料只能用一次。下次再想用這些資料時就得重新輸入。而且在終端上輸入時,若輸入有誤修改起來不是很方便。

  輸出到終端螢幕上的資訊只能看不能動。我們無法對此輸出作更多處理,如將輸出作為另一命令的輸入進行進一步的處理等。

  為瞭解決上述問題,Linux系統為輸入、輸出的傳送引入了另外兩種機制,即輸入/輸出重新導向和管道。

  輸入重新導向

  輸入重新導向是指把命令(或可執行程式)的標準輸入重新導向到指定的檔案中。也就是說,輸入可以不來自鍵盤,而來自一個指定的檔案。所以說,輸入重新導向主要用於改變一個命令的輸入源,特別是改變那些需要大量輸入的輸入源。

  例如,命令wc統計指定檔案包含的行數、單詞數和字元數。如果僅在命令列上鍵入:

  $ wc

  wc將等待使用者告訴它統計什麼,這時shell就好象死了一樣,從鍵盤鍵入的所有文本都出現在螢幕上,但並沒有什麼結果,直至按下<ctrl+d>,wc才將命令結果寫在螢幕上。

  如果給出一個檔案名稱作為wc命令的參數,如下例所示,wc將返回該檔案所包含的行數、單詞數和字元數。

  $ wc /etc/passwd

  20 23 726 /etc/passwd

  $

  另一種把/etc/passwd檔案內容傳給wc命令的方法是重新導向wc的輸入。輸入重新導向的一般形式為:命令<檔案名稱。可以用下面的命令把wc命令的輸入重新導向為/etc/passwd檔案:

  $ wc < /etc/passwd

  20 23 726

   另一種輸入重新導向稱為here文檔,它告訴shell當前命令的標準輸入來自命令列。here文檔的重新導向操作符使用<<。它將一對分隔字元 (本例中用delim表示)之間的本文重新導向輸入給命令。下例將一對分隔字元delim之間的本文作為wc命令的輸入,統計出本文的行數、單詞數和字元數。

  $ wc <<!

  >this text forms the content

  >of the here document,which

  >continues until the end of

  >text delimter!(注意:此處用!結束不了,必須單獨一行是!,單獨一行即使是!!也不行)

  >!

  4 17 98

   在<<操作符後面,任何字元都可以作為本文開始前的分隔字元,本例中使用歎號作為分隔字元。here文檔的本文一直延續到遇見另一個分隔 符為止。第二個分隔字元應出現在新行的開頭並且也是結尾。這時here文檔的本文(不包括開始和結束的分隔字元)將重新定向送給命令wc作為它的輸入。

  由於大多數命令都以參數的形式在命令列上指定輸入檔案的檔案名稱,所以輸入重新導向並不經常使用。儘管如此,當要使用一個不接受檔案名稱作為輸入參數的命令,而需要的輸入內容又存在一個檔案裡時,就能用輸入重新導向解決問題。

  輸出重新導向 (四種重新導向操作符:> and >> and 2> and &>)

  輸出重新導向是指把命令(或可執行程式)的標準輸出或標準錯誤輸出重新定向到指定檔案中。這樣,該命令的輸出就不顯示在螢幕上,而是寫入到指定檔案中。

   輸出重新導向比輸入重新導向更常用,很多情況下都可以使用這種功能。例如,如果某個命令的輸出很多,在螢幕上不能完全顯示,那麼將輸出重新導向到一個檔案中, 然後再用文字編輯器開啟這個檔案,就可以查看輸出資訊;如果想儲存一個命令的輸出,也可以使用這種方法。還有,輸出重新導向可以用於把一個命令的輸出當作另 一個命令的輸入(還有一種更簡單的方法,就是使用管道,將在下面介紹)。

  輸出重新導向的一般形式為:命令>檔案名稱。例如:

  $ ls > directory.out

  $ cat directory.out

  ch1.doc ch2.doc ch3.doc chimp config mail/ test/

  將ls命令的輸出儲存為一個名為directory.out的檔案。

  註:如果>符號後邊的檔案已存在,那麼這個檔案將被重寫。

   為避免輸出重新導向中指定檔案只能存放當前命令的輸出重新導向的內容,shell提供了輸出重新導向的一種追加手段。輸出追加重新導向與輸出重新導向的功能非常相 似,區別僅在於輸出追加重新導向的功能是把命令(或可執行程式)的輸出結果追加到指定檔案的最後,而該檔案原有內容不被破壞。

  如果要將一條命令的輸出結果追加到指定檔案的後面,可以使用追加重新導向操作符>>。形式為:命令>>檔案名稱。例如:

  $ ls *.doc>>directory.out

  $ cat directory.out

  ch1.doc ch2.doc ch3.doc chimp config mail/ test/

  ch1.doc ch2.doc ch3.doc

  和程式的標準輸出重新導向一樣,程式的錯誤輸出也可以重新定向。使用符號2>(或追加符號2>>)表示對錯誤輸出裝置重新導向。例如下面的命令:

  $ ls /usr/tmp 2> err.file

  可在螢幕上看到程式的正常輸出結果,但又將程式的任何錯誤資訊送到檔案err.file中,以備將來檢查用。

  還可以使用另一個輸出重新導向操作符(&>)將標準輸出和錯誤輸出同時送到同一檔案中。例如:

  $ ls /usr/tmp &> output.file

  利用重新導向將命令組合在一起,可實現系統單個命令不能提供的新功能。例如使用下面的命令序列:

  $ ls /usr/bin > /tmp/dir

  $ wc -w </tmp/dir

  459

  統計了/usr/bin目錄下的檔案個數。

  管 道

  將一個程式或命令的輸出作為另一個程式或命令的輸入,有兩種方法,一種是通過一個臨時檔案將兩個命令或程式結合在一起,例如上個例子中的/tmp/dir檔案將ls和wc命令聯在一起;另一種是Linux所提供的管道功能。這種方法比前一種方法更好。

  管道可以把一系列命令串連起來,這意味著第一個命令的輸出會作為第二個命令的輸入通過管道傳給第二個命令,第二個命令的輸出又會作為第三個命令的輸入,以此類推。顯示在螢幕上的是管道行中最後一個命令的輸出(如果命令列中未使用輸出重新導向)。

  通過使用管道符“|”來建立一個管道行。用管道重寫上面的例子:

  $ ls /usr/bin|wc -w

  1789

  再如:

  $ cat sample.txt|grep "High"|wc -l

  管道將cat命令(列出一個檔案的內容)的輸出送給grep命令。grep命令在輸入裡尋找單詞High,grep命令的輸出則是所有包含單詞High的行,這個輸出又被送給wc命令,wc命令統計出輸入中的行數。假設sample.txt檔案的內容如下:

  Things to do today:

  Low:Go grocery shopping

  High:Return movie

  High:Clear level 3 in Alien vs. Predator

  Medium:Pick up clothes from dry cleaner

  那麼該管道行的結果是2。

  命令替換

  命令替換和重新導向有些相似,但區別在於命令替換是將一個命令的輸出作為另外一個命令的參數。常用命令格式為:

  command1 `command2`

  其中,command2的輸出將作為command1的參數。需要注意的是這裡的`符號,被它括起來的內容將作為命令執行,執行後的結果作為command1的參數。例如:

  $ cd `pwd` (注意這個符號式反單引號,~鍵上的那個)

  該命令將pwd命令列出的目錄作為cd命令的參數,結果仍然是停留在目前的目錄下。

      再比如,刪除批量檔案

      rm ·ls | grep 'HelloWorld'· 將刪除目前的目錄中所有檔案名稱中含有HelloWorld的檔案,不加詢問。如果添加參數 -i會在刪除之前詢問。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.