Linux 中的管道和重定向
介紹
管道和重定向是 Linux 中使用的兩種不同的機制。有時,我們需要將一個命令的輸出作為另一個命令的輸入並執行某些操作。在這種情況下,我們使用管道運算子。運算子是“|”。它位於“Enter”鍵的上方。有時,我們會將所有命令的輸出重定向或傳遞到檔案以進行儲存。此外,我們將檔案的內容作為命令的輸入。這稱為重定向,並使用“>”、“>>”和“<”等運算子。
在本文中,我們將學習如何在 Linux 中使用管道和重定向。
示例 1:重定向到新檔案
當我們在 Linux 終端中執行任何命令時,輸出將列印在螢幕上。如果我們想傳送命令的輸出,我們可以使用“>”來執行此操作。
在第一個示例中,我們將看到終端中的輸出。
$ ls -lhrt total 16K drwxrwxr-x 3 rian rian 4.0K Feb 11 22:22 zip-unzip drwxrwxr-x 2 rian rian 4.0K Feb 11 22:37 bash drwxrwxr-x 2 rian rian 4.0K Feb 11 2016 cat-more-less drwxrwxr-x 2 rian rian 4.0K Feb 11 2016 cmd-bash
現在,在使用“>”之後,終端中將沒有任何輸出,輸出將儲存在“redirection.txt”中。
$ ls -lhrt > redirection.txt $ cat redirection.txt total 16K drwxrwxr-x 3 rian rian 4.0K Feb 11 22:22 zip-unzip drwxrwxr-x 2 rian rian 4.0K Feb 11 22:37 bash -rw-rw-r-- 1 rian rian 0 Feb 11 22:43 redirection.txt drwxrwxr-x 2 rian rian 4.0K Feb 11 2016 cat-more-less drwxrwxr-x 2 rian rian 4.0K Feb 11 2016 cmd-bash
示例 2:重定向到現有檔案
在最後一個示例中,我們已將輸出重定向到新檔案。我們也可以將輸出重定向到現有檔案。但是有一個問題。如果我們使用“>”重定向到現有檔案,則現有檔案的內容將消失。
$ cat 123.txt 123 $ ls -lhrt > 123.txt $ cat 123.txt total 20K drwxrwxr-x 3 rian rian 4.0K Feb 11 22:22 zip-unzip drwxrwxr-x 2 rian rian 4.0K Feb 11 22:37 bash -rw-rw-r-- 1 rian rian 269 Feb 11 22:43 redirection.txt -rw-rw-r-- 1 rian rian 0 Feb 11 22:50 123.txt drwxrwxr-x 2 rian rian 4.0K Feb 11 2016 cat-more-less drwxrwxr-x 2 rian rian 4.0K Feb 11 2016 cmd-bash
現在我們可以看到檔案 123.txt 的舊內容消失了。在這種情況下,我們必須使用“>>”來保留舊內容並追加重定向的內容。
$ cat 123.txt 123 $ ls -lhrt >> 123.txt $ cat 123.txt 123 total 24K drwxrwxr-x 3 rian rian 4.0K Feb 11 22:22 zip-unzip drwxrwxr-x 2 rian rian 4.0K Feb 11 22:37 bash -rw-rw-r-- 1 rian rian 269 Feb 11 22:43 redirection.txt -rw-rw-r-- 1 rian rian 4 Feb 11 22:53 123.txt drwxrwxr-x 2 rian rian 4.0K Feb 11 2016 cat-more-less drwxrwxr-x 2 rian rian 4.0K Feb 11 2016 cmd-bash
示例 3:從現有檔案重定向
我們還可以從現有檔案重定向併為任何命令提供輸入。讓我們看看下面的示例。在這裡,我們使用“grep”命令從檔案“123.txt”的內容中搜索“123”。
$ grep -i "123" < 123.txt 123 -rw-rw-r-- 1 rian rian 4 Feb 11 22:53 123.txt
示例 4:重定向 STDERR
我們可以使用“>”之前的“2”將僅錯誤重定向到檔案。
$ ls nofile.txt ls: cannot access 'nofile.txt': No such file or directory $ ls nofile.txt 2> error.txt $ cat error.txt ls: cannot access 'nofile.txt': No such file or directory
一個限制是,“error.txt”將僅包含 STDERR。如果我們希望在一個檔案中獲取 STDOUT 和 STDERR,則必須使用以下命令。讓我們看看步驟。
$ ls nofile.txt bash/ ls: cannot access 'nofile.txt': No such file or directory bash/: bash_function.sh bash_pass_arg.sh bash_return.sh bash_return_usingglobal.sh return3.sh $ ls nofile.txt bash/ 2> error.txt bash/: bash_function.sh bash_pass_arg.sh bash_return.sh bash_return_usingglobal.sh return3.sh $ cat error.txt ls: cannot access 'nofile.txt': No such file or directory $ ls nofile.txt bash > error.txt 2>&1 $ cat error.txt ls: cannot access 'nofile.txt': No such file or directory bash: bash_function.sh bash_pass_arg.sh bash_return.sh bash_return_usingglobal.sh return3.sh
示例 1:使用單個和多個管道
我們可以將一個命令的輸出傳遞到後續命令以執行某些操作並獲得所需的輸出。讓我們看看下面的一個簡單示例。
$ ls 123.txt bash cat-more-less cmd-bash error.txt redirection.txt zip-unzip $ ls | grep -i "bash" bash cmd-bash
我們可以看到命令從左到右流動。
可以在一行中使用多個管道來獲取所需的輸出。
$ ls | grep -i "bash" | wc -l 2
結論
透過本文,我們瞭解瞭如何在 Linux 中使用管道和重定向。
我們學習了以下運算子。
“>” , “>>”, “<”, “|”
這些命令有助於我們更快地操作並獲得預期的輸出。因此,根據需要,我們應該在 Linux 中使用相應的命令。
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP