Linux教程 - 管道和重定向

 

管道和重定向!

保持數據流動mysql

介紹

 

在前兩節中,咱們看了一些能夠爲咱們操做數據的過濾器。在本節中,咱們將看到咱們如何將它們結合在一塊兒來執行更強大的數據操做。ios

本節涉及一些閱讀。即便這些機制及其使用很是簡單,但若是您但願有效使用這些機制,瞭解其行爲的各類特徵也很重要。sql

那麼他們是什麼?

咱們在命令行上運行的每一個程序都會自動鏈接三個數據流。安全

  • STDIN(0) - 標準輸入(數據輸入到程序中)
  • STDOUT(1) - 標準輸出(由程序打印的數據,默認爲終端)
  • STDERR(2) - 標準錯誤(對於錯誤消息,也默認爲終端)

節目流

管道和重定向是咱們能夠將程序和文件之間的這些流鏈接起來,以有趣和有用的方式引導數據的手段。less

咱們將在下面用幾個例子來演示管道和重定向,但這些機制能夠在命令行上的每一個程序中使用,而不只僅是咱們在示例中使用的那些。ide

重定向到一個文件

一般狀況下,咱們會在屏幕上顯示輸出,這在大多數狀況下都很方便,但有時咱們可能但願將其保存到文件中做爲記錄,放入另外一個系統或發送給其餘人。大於運算符(>)向命令行指示咱們但願程序輸出(或發送到STDOUT的任何內容)以保存在文件中而不是打印到屏幕上。咱們來看一個例子。ui

  1. LS
  2. barry.txt bob example.png firstfile foo1 video.mpeg
  3. ls> myoutput
  4. LS
  5. barry.txt bob example.png firstfile foo1 myoutput video.mpeg
  6. 貓myoutput
  7. barry.txt
  8. 短髮
  9. example.png
  10. firstfile
  11. foo1
  12. MyOutput中
  13. video.mpeg

讓咱們分解一下:this

  • 第1行讓咱們先看看當前目錄中的內容。
  • 第3行如今咱們將運行相同的命令,可是此次咱們使用>來告訴終端將輸出保存到文件myoutput中。你會注意到咱們不須要在保存以前建立文件。若是終端不存在,終端將自動建立它。
  • 第4行如您所見,咱們的新文件已建立。
  • 第6行讓咱們來看看在那裏保存了什麼。

一些觀察

您會注意到,在上面的示例中,保存在文件中的輸出在打印到屏幕時每行只有一個文件,而不是一行。緣由是屏幕是已知的寬度,程序能夠格式化它的輸出以適應這種狀況。當咱們重定向時,它多是一個文件,或者它可能在其餘地方,因此最安全的選擇是將其格式化爲每行一個條目。這也可讓咱們稍後更輕鬆地處理這些數據,由於咱們將在頁面的下方看到。spa

當管道和重定向時,實際數據老是相同的,可是這些數據的格式可能與一般打印到屏幕上的數據稍有不一樣。記住這一點。命令行

您還會注意到咱們建立的用於保存數據的文件也在咱們的列表中。機制的工做方式是首先建立文件(若是它不存在),而後程序運行並輸出保存到文件中。

保存到現有文件

若是咱們重定向到一個不存在的文件,它會自動爲咱們建立。可是,若是咱們保存到一個已經存在的文件中,那麼它的內容將被清除,而後新的輸出保存到它。

  1. 貓myoutput
  2. barry.txt
  3. 短髮
  4. example.png
  5. firstfile
  6. foo1
  7. MyOutput中
  8. video.mpeg
  9. wc -l barry.txt> myoutput
  10. 貓myoutput
  11. 7 barry.txt

咱們可使用double大於運算符(>>)將新數據附加到文件中。

  1. 貓myoutput
  2. 7 barry.txt
  3. ls >> myoutput
  4. 貓myoutput
  5. 7 barry.txt
  6. barry.txt
  7. 短髮
  8. example.png
  9. firstfile
  10. foo1
  11. MyOutput中
  12. video.mpeg

從文件重定向

若是咱們使用小於運算符(<),那麼咱們能夠用另外一種方式發送數據。咱們將從文件中讀取數據,並經過它的STDIN流將其傳送到程序中。

  1. wc -l myoutput
  2. 8 myoutput
  3. wc -l <​​myoutput
  4. 8

許多程序(正如咱們在前面的章節中看到的)容許咱們提供一個文件做爲命令行參數,它將讀取和處理該文件的內容。鑑於此,您可能會問爲何咱們須要使用此操做員。上面的例子說明了一個微妙但有用的區別。您會注意到,當咱們運行wc提供文件以做爲命令行參數處理時,程序的輸出中包含了已處理文件的名稱。當咱們運行它時,將文件的內容重定向到wc文件名不被打印。這是由於不管什麼時候咱們使用重定向或管道,數據都是匿名發送的。因此在上面的例子中,wc收到了一些要處理的內容,但它不知道它來自哪裏,因此它可能不會打印這些信息。結果是,

咱們能夠很容易地將咱們目前看到的兩種形式的重定向合併爲一個命令,以下面的示例所示。

  1. wc -l <​​barry.txt> myoutput
  2. 貓myoutput
  3. 7

重定向STDERR

如今咱們來看看第三個是標準錯誤仍是STDERR的流。這三個流實際上都有與它們相關的數字(在頁面頂部的列表中的括號內)。STDERR是2號流,咱們可使用這些數字來識別流。若是咱們在>操做符以前放置一個數字,那麼它會重定向該流(若是咱們不使用數字,就像咱們迄今爲止所作的那樣,那麼它默認爲流1)。

  1. ls -l video.mpg blah.foo
  2. ls:沒法訪問blah.foo:沒有這樣的文件或目錄
  3. -rwxr - r-- 1 ryan用戶6 5月16日09:14 video.mpg
  4. ls -l video.mpg blah.foo 2> errors.txt
  5. -rwxr - r-- 1 ryan用戶6 5月16日09:14 video.mpg
  6. cat errors.txt
  7. ls:沒法訪問blah.foo:沒有這樣的文件或目錄

也許咱們但願將正常輸出和錯誤消息保存到一個文件中。這能夠經過將STDERR流重定向到STDOUT流並將STDOUT重定向到文件來完成。咱們首先重定向到一個文件而後重定向錯誤流。咱們經過在流號碼的前面放置一個&來識別流的重定向(不然它將重定向到名爲1的文件)。

  1. ls -l video.mpg blah.foo> myoutput 2>&1
  2. 貓myoutput
  3. ls:沒法訪問blah.foo:沒有這樣的文件或目錄
  4. -rwxr - r-- 1 ryan用戶6 5月16日09:14 video.mpg
 

管道

到目前爲止,咱們已經處理向文件發送數據和從文件發送數據。如今咱們來看一下從一個程序發送數據到另外一個程序的機制。它被稱爲管道,咱們使用的操做符是(|)(位於大多數鍵盤上的反斜槓(\)鍵之上)。該操做員所作的是將左側程序的輸出做爲右側程序的輸入。在下面的例子中,咱們將只列出目錄中的前3個文件。

  1. LS
  2. barry.txt bob example.png firstfile foo1 myoutput video.mpeg
  3. ls | 頭-3
  4. barry.txt
  5. 短髮
  6. example.png

咱們能夠按照咱們喜歡的方式將盡量多的節目一塊兒製做 在下面的例子中,咱們而後將輸出傳送到尾部以便僅得到第三個文件。

  1. ls | 頭-3 | 尾巴-1
  2. example.png

咱們爲程序提供的任何命令行參數都必須在該程序旁邊。

我常常發現人們試圖將他們的管道一鼓作氣地寫出來,並在某處沿線犯了一個錯誤。而後他們認爲這是一個點,但實際上這是另外一點。他們浪費了大量的時間,試圖解決不存在的問題,而沒有看到存在的問題。若是你逐漸創建你的管道,那麼你將不會陷入這個陷阱。運行第一個程序並確保它提供您指望的輸出。而後添加第二個程序並再次檢查,而後再添加第三個,依此類推。這會爲你節省不少挫折。

你也能夠組合管道和重定向。

  1. ls | 頭-3 | tail -1> myoutput
  2. 貓myoutput
  3. example.png

更多示例

如下是一些更多的例子,可讓您瞭解您可使用管道進行的各類事情。有許多事情你能夠用管道來實現,而這些只是其中的一小部分。憑藉經驗和一點創造性思惟,我相信你會發現更多的方式來使用管道讓你的生活更輕鬆。

示例中使用的全部程序都是咱們之前見過的程序。然而,我已經使用了一些咱們還沒有涉及的命令行參數。查看相關的手冊頁以瞭解他們的工做。你也能夠本身嘗試命令,逐步創建起來,看看每一個步驟都在作什麼。

在這個例子中,咱們正在對目錄列表進行排序,以便首先列出全部目錄。

  1. ls -l / etc | tail -n +2 | 分類
  2. drwxrwxr-x 3 nagios nagcmd 4096 Mar 29 08:52 nagios
  3. drwxr-x--- 2 news news 4096 Jan 27 02:22 news
  4. drwxr-x--- 2 root mysql 4096 Mar 6 22:39 mysql
  5. ...

In this example we will feed the output of a program into the program less so that we can view it easier.

  1. ls -l /etc | less
  2. (Full screen of output you may scroll. Try it yourself to see.)

Identify all files in your home directory which the group has write permission for.

  1. ls -l ~ | grep '^.....w'
  2. drwxrwxr-x 3 ryan users 4096 Jan 21 04:12 dropbox

Create a listing of every user which owns a file in a given directory as well as how many files and directories they own.

  1. ls -l /projects/ghosttrail | tail -n +2 | sed 's/\s\s*/ /g' | cut -d ' ' -f 3 | sort | uniq -c
  2. 8 anne
  3. 34 harry
  4. 37 tina
  5. 18 ryan

Summary

>
Save output to a file.
>>
Append output to a file.
<
Read input from a file.
2>
Redirect error messages.
|
將一個程序的輸出做爲輸入發送到另外一個程序。
您能夠在命令行上運行的每一個程序都有3個流,STDIN,STDOUT和STDERR。
 

活動

讓咱們修改一些數據:

  • 首先,嘗試將各類命令的輸出保存到文件中。覆蓋該文件並追加到它。確保你正在使用絕對路徑和相對路徑。
  • 如今看看你是否只能列出目錄/ etc中最後20個文件。
  • 最後,看看您是否能夠計算在主目錄中有多少文件和目錄具備執行權限。
相關文章
相關標籤/搜索