管道:在GNU / Linux中開始使用它們所需要了解的內容

管道

管道或點e 實際上是一個可用於 UNIX/Linux 的管道,非常方便。 但要完全理解什麼是管道,您應該知道在 *nix 環境中它有 3 個內置數據流。 對於那些不知道的人來說,這意味著數據可以往返三個點。

然後你會更好地理解這一點,但我現在想向您說明的是,使用管道,您可以做的是從這些點之一到其他點的通道。 這允許將一個程序的輸出或結果作為另一個程序的輸入,以便可以使用等。 我將嘗試用一些實際的例子來解釋它,這將幫助你很好地理解它。

您正在談論的那些要點或 數據流,分別是:

  • 標準輸入: 對應於 0 並且是標準輸入。 通常,*nix 系統上的標準數據輸入是鍵盤。 也就是說,您鍵入的內容將是所使用的信息。 它有一個與之關聯的特殊設備,即 /dev/stdin。
  • 標準輸出: 標識為1,是標準輸出。 通常,它對應於您計算機的顯示器或屏幕,您可以在其中看到信息。 例如,當您執行 ls 命令時,內容列表將顯示在屏幕上,對嗎? 關聯的設備是 /dev/stdout。
  • 斯特德: 標識為2,為標準錯誤輸出,用於程序出錯時。 關聯的設備是 /dev/stderr。

使用管道,您可以使一個命令的標準輸出或標準輸出直接傳遞到另一個命令的標準輸入. 也就是說,您可以讓一個程序餵養另一個程序。 管道不使用鍵盤輸入參數,而是通過 | 表示的管道傳遞前一個命令生成的信息。

例子 你會更好地理解它。 想像一下,您想要列出一個目錄的內容,但您只對查看與單詞 doc 匹配的名稱感興趣。 然後,您可以使用管道將 ls 的輸出通過管道傳輸到 grep 過濾器的輸入,以告訴它只顯示與該模式匹配的那些:

ls -l | grep doc

因此,它不會向您顯示所有名稱,而只是向您顯示 那些你真正感興趣的. 您可以對文件的內容執行相同的操作。 想像一下,您只想查看名為 firefox 的進程的信息,而不是全部:

ps aux | grep firefox

它不是將 ps 程序的所有輸出輸出到屏幕(stdout),而是將其通過管道傳輸到 grep 過濾器的輸入,並且在這種情況下僅輸出與 firefox 模式匹配的內容......

如果需要,可以使用 各種管道 將一個命令的輸出帶到第二個命令的輸入,並將第二個命令的輸出帶到第三個命令的輸入,依此類推。 例如:

cat libro | grep love | more

如你所見, 可能性很多,所有你能想像和被允許的。 甚至只顯示文件的第一行和最後一行,計算來自列表的輸入 wc 的行,甚至對它們進行排序:

cat listado | head
cat listado | tail
cat listado | wc -l
cat listado | sort

您還可以使用 |& 的錯誤 例如,如果腳本失敗,請在腳本的輸出中查找單詞 alert:

./miscript |& grep alerta 

最後,有兩個與管道緊密相關的命令 tee 和 xargs 這可以進一步擴展這些的可能性。 在 tee 的情況下,它將允許在 stdout 上顯示引導程序的輸出,以便您可以看到它,最重要的是,它可以將其通過管道傳輸到另一個文件。 舉個例子,如果你列出了一個目錄的內容,你想立即查看 ls -l 的輸出,並將它保存在一個文件 listing.txt 中:

ls -l | tee listado.txt

如果你不使用 tee 你將無法在你的控制台上看到輸出結果......

Y 參數 在某些情況下甚至更有趣。 在這種情況下,它能夠根據通過管道接收的標準輸入構建命令。 換句話說,它能夠捕獲引導程序通過其輸出拋出並通過管道到達 xargs 的所有內容,並將其作為參數依次傳遞給另一個命令。

還是不明白? 舉個例子你會看得更清楚。 想像一下,您想要從目錄、磁盤或分區中刪除所有該死的thumbs.db 文件。 如果有很多,可能無法用rm命令一一手動刪除。 但是使用 xargs 你可以自動化一切。 您可以使用 find 來定位它們,通過 xargs 的輸入發送輸出,這反過來會給 rm 名稱作為參數。 因此,所有自動找到的都將被刪除:

find ./ -name "thumbs.db" | xargs rm

例如,假設 find 定位到 /home/name/thumbs.db、/media/test/thumbs.db 和 /tmp/thumbs.db。 好吧,xargs 會將它們傳遞給 rm,就好像它們是參數一樣。 也就是說,就好像我們執行了:rm /home/name/thumbs.db,然後是 rm /media/test/thumbs.db,然後是 rm /tmp/thumbs.db。


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責資料:AB Internet Networks 2008 SL
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   何塞 他說:

    太好了,這個信息對我們 linux 用戶來說非常重要

  2.   但以理書 他說:

    多麼棒的文章啊,現在我正在《Linux 命令行》一書中研究 I/O 重定向。 我對管道(Pipeline)和三個數據流更加清楚了。 感謝您的貢獻。 問候。

  3.   01101001b 他說:

    xargs 的例子對我很有用。 就在今天,我正在處理多重出口的小細節,我必須“分部分”發送。 xargs走了一點畫。
    超級感謝!