linux重定向和管道的使用

bash的I/O重定向及管道 

    程序是由程序+指令組成;或者是數據結構+算法

    程序數據來自哪裏,處理的結果又存放於哪裏?

    程序必須能夠讀入輸出然後經過加工來產生結果;程序獲取的數據可以使數據也可以hi變量、數據、列表文件等等,程序生產出來的結果可以是變量、數據、列表、文件等。也就是說,程序都有讀入數據和輸入數據的需求。

    讀入數據:Input

    輸出數據:Output

        通常對於程序來說,輸入輸出數據可以是鍵盤、鼠標、顯示器等;當然有時候輸入的數據是程序自身內部所具有的,但我們認爲這些數據應該是通過外部輸入的,同樣,輸出的數據也有顯示器或文件,因此我們多了一個選擇,到底是從哪裏輸入數據,產生的數據又存放在那裏。因此就應該有一種缺省的定義,指認默認的輸入輸出途徑,當程序不指從哪裏輸入,輸出到那兒,默認的途徑就是進行數據交換。

   一般缺省的輸入我們稱之爲:標準輸入,缺省的輸出稱之爲:標準輸出。

    標準輸入:鍵盤

    標準輸出:顯示器

打開的文件都有一個fd:file descriptor(文件描述符)

linux給程序提供三I/O設備

    標準輸入(STDIN)    0    默認接受來自鍵盤的輸入

    標準輸出(STDOUT)    1    默認輸出到終端窗口

    標準錯誤(STDERR)    2    默認輸出到終端窗口

I/O重定向:改變標準位置

STDOUT和STDERR可以被重定向到文件:

     命令    操作符號    文件名

     ls   /etc/    >   /tmp/1.out

   支持的操作符號包括以下幾種:

    >    把STDOUT重定向到文件

    2>  把STDERR重定向到文件

    &> 把所有輸出重定向到文件


wKioL1ebQcezSKJsAAAxkncmers186.png-wh_50

        當我查看/etc/issue文件時,不將文件的內容輸出到屏幕而是將文件內容重定向到/tmp/1.out文件當中,當我列出/root目錄下面不存在的文件時,本應該會提示文件不存在的信息,利用“2>”將報錯信息重定向到/tmp/2.out,&符號是將正確的信息和錯誤的信息一起重定向到某個文件。

當我想再次使用>時,第一次重定向的文件將會被覆蓋,使用“>>”追加符號,會將正確的輸出追加到文件裏,這是我們可以使用set -C禁止將內容覆蓋已有文件,但可追加強制覆蓋:>|,如果想再次開啓覆蓋重定向只需要set  + C即可。

>>在原有內容的基礎之上,追加新內容

2>>追加重定向錯誤輸出數據流

標準輸出和錯誤輸出各自定向到不同的位置

command > /path/to/file.out   2>/path/to/error.out

合併標準輸出和錯誤輸出爲同一個數據流進行重定向:

&>:覆蓋重定向,將正確和錯誤信息一同覆蓋輸入到同一個文件

&>>:追加重定向,將正確和錯誤信息一同追加到原有內容的後面

command >/path/to/file.out 2>&1執行某條命令後將錯誤的信息當成正確的信息重定向到文件

command >> /path/to/fileout 2>>&1跟上面類似,只不過是追加輸出內容到文件

():合併多個程序的STDOUT

      (ls /etc/issue;cat /etc/passwd )> all.out



tr命令   

tr [OPTION]... SET1 [SET2]
-c或--complerment:取字符集的補集

-d或--delete:刪除所有屬於第一字符集的字符

-s或--squeeze-repeats:把連續重複的字符以單獨一個字符表示

-t或--truncate-set1:將第一個字符集對應字符轉化爲字符集對應的字符


wKiom1ebSQbx7hgmAAATMEpo5KE846.jpg-wh_50

wKioL1ebSQbyhOtOAAAPIYHvR74123.jpg-wh_50


從文件中導入STDIN

使用<來重定向到標準輸入

某些命令能夠接受從文件導入的STDIN:

    tr  'a-z'  'A-Z' < /etc/issue

wKiom1ebSZLB7EjKAAAXjuLIq5E538.jpg-wh_50

這個命令是將/etc/issue文件裏面的內容裏的小寫字符全部替換成大寫字符

tr -d  abcd </etc/fstab  刪除fstab文件的所有abc中任意字符

wKioL1ebSmuCgg0OAAAgcxlDpeI822.jpg-wh_50

        <<EOF標準輸入,EOF是起始符(這個EOF是而已隨意起名的,但是必須得保證結束符號也用相同的字符),按回車之後等待鍵盤輸入內容,輸入完內容之後同樣 以EOF結尾哦結束符來結束交互並且將標準入的內容又重定向到文件中去

    舉個例子發個郵件給hadoop

mail  -s  “good”  hadoop  <<END

>how  are you  ?

>my name is `id -nu`

>my hostname is `hostname`

>END



管道  

    前一個命令的輸出作爲後一個命令的輸入

  command1|command2|command3

將命令1的STDOUT發送給命令2的STDIN,命令2的STDOUT發送到命令3的STDIN

STDERR默認是不能通過管道轉發哦,但是可以利用2>&1或|&實現

最後一個命令會在當前shell進程的子進程中用來執行

組合多種工具的功能

    ls |tr  'a-z '  'A-Z'

wKioL1ebTMfBvTklAAAzBe7MM7E573.jpg-wh_50

管道的應用

less:一頁一頁的查看輸入

  ls  -l   /etc/|less


mail:通過電子郵件發送輸入:

echo  " test site "  |mail -s "test"   [email protected]


重定向到多個目標(tee)

  command1 |tree   filename  |command2

把命令1的STDOUT保存在文件名中,然後管道輸入給命令2

wKiom1ebTiiQxppTAAAj-_HJRLU922.jpg-wh_50

使用:

保存不同階段的輸出

複雜管道的故障排除

同時查看和記錄輸出



練習題 

1、將/etc/issue文件中的內容轉換爲大寫後保存至/tmp/issue.out文件中

     tr  'a-z'  'A-Z'  </etc/issue  > /tmp/issue.out

2、將當前系統登錄用戶的信息轉換爲大寫後保存至/tmp/who.out文件中

   who |tr 'a-z '  'A-Z'  > /tmp/who.out

3、一個linux用戶給root發郵件,要求郵件標題爲”help”,郵件正文如下:
Hello, I am 用戶名,the system version is here,please help me to
check it ,thanks!
操作系統版本信息

    mail -s "help"  root  <<EOF

>Hello, I am `id -nu`  ,the system version is here,please help me to
>check it ,thanks!

>`cat /etc/centos-release`

>EOF


4、將/root/下文件列表,顯示成一行,並文件名之間用空格隔開

    ls   /root/  |tr  '\n'  '   '

5、file1文件的內容爲:”1 2 3 4 5 6 7 8 9 10” 計算出所有數字的總和

    cat 1.file  |xargs  -n1 |echo $[ $(tr '[[:space:]]'+' ) 0 ]

6、刪除Windows文本文件中的'^M'字符

     cat /root/1.txt|tr -d '\r'  '   '  

7、處理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的數字和空格

    tr  -d -c   ‘[[[:space:]][[:digit:]]'  <“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4"

8、將PATH變量每個目錄顯示在獨立的一行

    echo $PATH|tr ':'  '\n'

9、刪除指定文件的空行

        tr  -s  '\n'  << inittab

10、將文件中每個單詞(字母)顯示在獨立的一行,並無空行

          tr -cs   [[:alpha:]]   '\n' << /etc/inittab

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章