1. 程式人生 > >《快樂的Linux命令列》學習記錄——重定向

《快樂的Linux命令列》學習記錄——重定向

I/O重定向: “I/O” 代表輸入/輸出,通過這個工具,你可以重定向命令的輸入輸出,命令的輸入來自檔案,而輸出也存到檔案。也可以把多個命令連線起來組成一個強大的命令管道

本章主要介紹的命令如下:

• cat -連線檔案 • sort -排序文字行 • uniq -報道或省略重複行 • grep -列印匹配行 • wc -列印檔案中換行符,字,和位元組個數 • head -輸出檔案第一部分 • tail - 輸出檔案最後一部分

1 標準輸入,輸出,和錯誤 我們用到的許多程式都會產生某種輸出。這種輸出,經常由兩種型別組成。 第一,程式執行結果;這是說,程式要完成的功能。 第二,我們得到狀態和錯誤資訊

,這些告訴我們程式進展。

1)標準輸出: 執行結果輸送到一個叫做標準輸出的特殊檔案(經常用 stdout 表示);

2)標準錯誤輸出: 它們的狀態資訊則送到另一個叫做標準錯誤的檔案(stderr)

預設情況下,標準輸出和標準錯誤都連線到螢幕,而不是儲存到磁碟檔案

3)標準的輸入: 許多程式從一個叫做標準輸入(stdin)的裝置得到輸入,預設情況下,標準輸入連線到鍵盤

總結: I/O 重定向允許我們可以更改輸出走向和輸入來向。一般地,輸出送到螢幕,輸入來自鍵盤,但是通過 I/O 重定向,我們可以改變輸入輸出方向。

2 重定向標準輸出 把一個命令的執行結果儲存到一個檔案中,很有用。

重定向符號有兩種: 1)>:從開頭重寫檔案 2)>>:把重定向結果追加到檔案內容後面

eg: 我們可以告訴 shell 把 ls 命令的執行結果輸送到檔案 ls-output.txt 中去,由檔案代替螢幕。

[[email protected] ~]$ ls -l /usr/bin > ls-output.txt

建立了一個長長的目錄/usr/bin 列表,並且輸送程式執行結果到檔案 ls-output.txt 中。我們檢查一下重定向的命令輸出結果:

[[email protected] ~]$ ls -l ls-output.txt -rw-rw-r-- 1 me me 167878 2008-02-01 15:07 ls-output.txt

less 閱讀器

來檢視這個檔案,看到檔案ls-output.txt 的確包含 ls 命令的執行結果。

[[email protected] ~]$ less ls-output.txt

重複我們的重定向測試,我們把目錄換成一個不存在的目錄

[[email protected] ~]$ ls -l /bin/usr > ls-output.txt ls: cannot access /bin/usr: No such file or directory

為什麼這條錯誤資訊顯示在螢幕上而不是被重定向到檔案 ls-output.txt? 答:ls 程式不把它的錯誤資訊輸送到標準輸出,因為我們只是重定向了標準輸出,而沒有重定向標準錯誤,所以錯誤資訊被送到螢幕。

但是首先看一下我們的輸出檔案發生了什麼事情? 在這裡插入圖片描述

注:簡單地使用重定向符,沒有命令在它之前,這會刪除一個已存在檔案的內容或是建立一個新的空檔案

怎樣才能把重定向結果追加到檔案內容後面,而不是從開頭重寫檔案? 答案:使用 “>>” 重定向符

接著上面的eg繼續:

[[email protected] ~]$ ls -l /usr/bin >> ls-output.txt

使用 “>>” 操作符,將導致輸出結果新增到檔案內容之後。如果檔案不存在,檔案會被建立

我們重複執行命令三次,導致輸出檔案大小是原來的三倍

[[email protected] ~]$ ls -l /usr/bin >> ls-output.txt [[email protected] ~]$ ls -l ls-output.txt -rw-rw-r-- 1 me me 503634 2008-02-01 15:45 ls-output.txt

3 重定向標準錯誤

重定向標準錯誤缺乏專用的重定向操作符。重定向標準錯誤,我們必須參考它的檔案描述符

shell 提供了一種表示法來重定向檔案,使用檔案描述符。因為標準錯誤和檔案描述符 2 一樣,我們用這種表示法來重定向標準錯誤

[[email protected] ~]$ ls -l /bin/usr 2> ls-error.txt

檔案描述符 “2”,緊挨著放在重定向操作符之前,來執行重定向標準錯誤到檔案 ls-error.txt任務。

4 重定向標準輸出和錯誤到同一個檔案

1)舊版本的bash(麻煩,別用了)

[[email protected] ~]$ ls -l /bin/usr > ls-output.txt 2>&1

在這裡插入圖片描述

2)新版本的bash

[[email protected] ~]$ ls -l /bin/usr &> ls-output.txt

我們使用單單一個表示法 &> 來重定向標準輸出和錯誤到檔案 lsoutput.txt。

5 處理不需要的輸出

我們不想要一個命令的輸出結果,只想把它們扔掉。 通過重定向輸出結果到一個特殊的叫做 “/dev/null” 的檔案。 這個檔案是系統裝置,叫做位儲存桶,它可以接受輸入,並且對輸入不做任何處理。

[[email protected] ~]$ ls -l /bin/usr 2> /dev/null

6 重定向標準輸入 結合下面的7去看

7 cat -連線檔案

cat 命令讀取一個或多個檔案,然後複製它們到標準輸出。

cat [file]

cat 經常被用來顯示簡短的文字檔案,你可以使用 cat 來顯示檔案而沒有分頁

[[email protected] ~]$ cat ls-output.txt

cat用來把檔案連線在一起。比方說我們下載了一個大型檔案,這個檔案被分離成多個部分(USENET 中的多媒體檔案經常以這種方式分離)。

cat movie.mpeg.0* > movie.mpeg

用cat來建立簡短的文字檔案,比方說,我們想建立一個叫做 “lazy dog.txt” 的檔案,這個檔案包含例子中的文字。

[[email protected] ~]$ cat > lazy_dog.txt

輸入命令,其後輸入要放入檔案中的文字。

最後輸入 Ctrl+d。通過使用這個命令,來告訴 cat,在標準輸入中,它已經到達檔案末尾(EOF)。我們使用 cat 來複制檔案內容到標準輸出:

[[email protected] ~]$ cat lazy_dog.txt

除了檔名引數,讓我們試著重定向標準輸入:

[[email protected] ~]$ cat < lazy_dog.txt

使用“<”重定向操作符,我們把標準輸入源從鍵盤改到檔案 lazy dog.tx。

8 管道線

命令可以從標準輸入讀取資料,然後再把資料輸送到標準輸出。

管道線: 使用管道操作符 “|”(豎槓),一個命令的標準輸出可以,以管道的方式到另一個命令的標準輸入

command1 | command2

我們已經知道有一個命令接受標準輸入?它是 less 命令。 我們用 less 來一頁一頁地顯示任何命令的輸出,命令把它的執行結果輸送到標準輸出

[[email protected] ~]$ ls -l /usr/bin | less

我們可以方便地檢測會產生標準輸出的任一命令的執行結果。

9 過濾器