Linux命令學習(重定向)

Pruett發表於2018-04-07

1.重定向概念

標準輸入,輸出,和錯誤到目前為止,我們用到的許多程式都會產生某種輸出。這種輸出,經常由兩種型別組成。 第一,程式執行結果;這是說,程式要完成的功能。第二,我們得到狀態和錯誤資訊, 這些告訴我們程式進展。如果我們觀察一個命令,像 ls,會看到它的執行結果和錯誤資訊 顯示在螢幕上。與 Unix 主題“任何東西都是一個檔案”保持一致,程式,比方說 ls,實際上把他們的執行結果 輸送到一個叫做標準輸出的特殊檔案(經常用 stdout 表示),而它們的狀態資訊則送到另一個 叫做標準錯誤的檔案(stderr)。預設情況下,標準輸出和標準錯誤都連線到螢幕,而不是 儲存到磁碟檔案。除此之外,許多程式從一個叫做標準輸入(stdin)的裝置得到輸入,預設情況下, 標準輸入連線到鍵盤。I/O 重定向允許我們可以更改輸出走向和輸入來向。一般地,輸出送到螢幕,輸入來自鍵盤, 但是通過I/O 重定向,我們可以改變輸入輸出方向。
2.標準輸出
使用 ” > ” 進行標準的輸出,將命令的結果輸出到一個檔案中, 但是這個重定向符進行輸出將會將原檔案中的內容清除 ,並且如果 命令的輸出不是標準輸出,而是產生了錯誤資訊,這個錯誤資訊不會輸入到檔案中,而是顯示在螢幕上.
如果想在進行標準輸出的時候不是將檔案重寫,而是在檔案內容的後面新增,就是用>> 重定向符
上面提到 使用上面的重定向符不能將錯誤資訊輸出到檔案,可以使用shell提供的一種表示方式,shell內部為標準輸入,標準輸出和錯誤的檔案描述符為0,1,2, 使用檔案描述符來重定向錯誤資訊

ls -l /bin/usr 2> ls-error.txt

要想將標準輸出和錯誤資訊都輸出到一個檔案,在bash中提供了兩種方法,這裡主要介紹第二種新的方法.

ls -l /bin/usr &> ls-output.txt

處理不需要的輸出
有時候,不想要一個命令的輸出結果,想把他們扔掉,,系統提供了一個方法,將資訊重定向到一個特殊的叫做 “/dev/null” 的檔案,這個是個系統裝置,叫做位儲存桶,可以接受輸入,並且對輸入不做任何處理.為了隱瞞命令錯誤資訊可以這麼做:

ls -l /bin/usr 2> /dev/null

3.標準輸入
3.1cat 連線檔案

cat [file]  //顯示檔案的內容,一般用來顯示簡短的文字檔案

cat可以接受不止一個檔案作為引數,將這些檔案的內容連線起來

cat movie*.txt > movie.txt //將多個檔案內容連結起來,重新定向到另一個檔案,萬用字元總是按照有序的循序展開,所以會按照循序正確安排.

如果cat 沒有給出任何引數,它會從標準輸入讀入資料,因為標準輸入,預設情況下,連線到鍵盤。它正在等待我們輸入資料! 使用Ctrl + d 告訴cat 在標準輸入中已經到了結尾.
可以用這個來建立個簡單的文字檔案

cat > a.txt // 回車
i am a boy.//這一行輸入想要輸入的內容,然後使用ctrl + d 告訴cat到了標準輸入的結尾

cat < a.txt   //使用< 重定向符將標準輸入源從鍵盤改到檔案a.txt,結果和使用只檔名一樣,

4.管道線
使用管道操作符 “|” ,一個命令的標準輸出可以管道到另一個命令的表追輸入.

command1 | command2

如:

ls -l /usr/bin | less

過濾器
幾個命令放在一起組成一個管道線,通常,以這種方式使用的命令被稱為過濾器

ls /bin  /usr/bin | sort | less //將兩個檔案中的檔案或資料夾排序輸出

uniq 報導或忽略重複行
通常和sort一起使用,來刪除重複的行

ls /bin /usr/bin | sort | uniq | less  //uniq -d 可以看到重複的行

wc 列印行, 字 和位元組數 (按照順序列印)

wc a.txt 

如果不帶引數, wc接受標準輸入 -l 屬性表示 只列印行數

 ls /bin /usr/bin | sort | uniq | wc -l

grep 列印匹配行
在文件中找到匹配的文字,列印出包含該這個型別的行,

grep pattern [file...]

在這裡匹配的模式可以很複雜,可以是正規表示式.同時它也接受標準輸入

ls /bin /usr/bin |sort | uniq | grep zip 

grep 有兩個方便的選項 -i 導致grep在執行搜尋忽略大小寫(通常,搜尋大小寫是敏感的),
“-v” 只列印不匹配的行
head / tail 列印檔案開頭部分 / 結尾部分
一般是列印文章的開頭 / 結尾的十行, 可以使用 ” -n ” 屬性來規定列印的行數,沒有引數的時候也接受標準輸入

ls /usr/bin | head -n 5   //列印前五行

tail 有一個選項 ” -f “, 可以實時的瀏覽檔案,當檔案有更新的時候,就顯示出來, 比如/var/log下的資訊檔案,

tail -f /var/log/messages 

tee 從stdin 讀取資料, 並同時輸出到stdout和檔案
為了和管道的隱喻保持一個, linux提供一個tee的命令,tee 程式從標準輸入讀入資料,並且同事複製資料到標準輸出(允許資料繼續隨著管道線流動) 和一個或多個檔案,當需要從某個中間處理階段來捕捉一個管道線的內容的時候,很有幫助.即將標準輸入中的內容在中間的時候放在檔案中,並且保證資料繼續隨著管道繼續流動.

  ls  /usr/bin | tee ls-out.txt | grep zip  
  //將ls出來的資料先存放在ls-out.txt中,在進行grep zip

總結: 上面說到用到標準輸入的程式有 sort , uniq , less ,wc, grep , head, tail ,tee
重定向,總結為 就是將輸入或者輸出不直接顯示在螢幕上,而是其他的檔案或者命令中.(這個總結可能片面,在剛學時候的簡單理解)

相關文章