Linux IO重定向及管道

一,標準輸入輸出:

    程序 : 指令+數據 

    程序 :IO

可用於輸入的設備:文件,鍵盤設備,文件系統上的常規文件,網卡等;

可用於輸出的設備:文件,顯示器,文件系統上的常規文件,網卡等,



程序的數據流有三種:

    輸入的數據流:<--  標準輸入(stdin),鍵盤

    輸出的數據流: -->標準輸出(stdout),顯示器

    錯誤輸出流:  -->錯誤輸出(stderr), 顯示器


fd:file descriptor 文件描述符


Linux 給程序提供三種I/O設備:

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

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

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


IO重定向:改變默認位置

STDOUT和STDERR 可以被重定向到文件,支持的操作符號包括:

    >   把STDOUT重定向到文件

    2>  把STDERR重定向到文件

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


輸出重定向:>

特性:覆蓋輸出!(很危險)

特殊設備: /dev/null    ##任何數據放到裏面都會丟棄

blob.png

# set  -C (僅對當前shell有效)

   禁止覆蓋輸出已存在的對象

ls /etc  > /tmp/out.txt    #強制覆蓋輸出 >|


# set  +C

    關閉上述特性


blob.png

ls /etc  > /tmp/out.txt

ls /etc  > /dev/sda           //可能會幹掉你的硬盤數據


輸出重定向:>>

特性:追加輸出!

錯誤輸出流  

    2>   : 覆蓋重定向錯誤輸出數據流

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

標準輸出和錯誤輸出各自重定向至不同位置

    COMMAND > /PATH/TO/FILE.OUT 2> /PATH/TO/ERRORFILE.OUT


合併正常和錯誤輸出流

    &> 覆蓋重定向

    &>> 追加重定向 

     COMMAND > /path/to/file.out 2> &1 (順序很重要) 

     COMMAND >> /path/to/file.out 2>> &1 


   find /etc -name passwd 2> /dev/null 


    ():合併多個程序的STDOUT ( cal 2007 ; cal 2008 ) > all.txt

     ls /etc  >> /tmp/out.txt  2>&1


輸入重定向  < :

   使用<來重定向標準輸入 

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

      # tr 'a-z' 'A-Z' < /etc/issue     //該命令將issue文件中的小寫字母全部轉換爲大寫

blob.png

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

blob.png

文檔終止詞 <<

使用 << 命令從鍵盤把多行重導向給STDIN,直到 終止詞 位置的所有文本都發給STDIN

blob.png



tr命令:

tr[OPTION]... SET1 [SET2]:把輸入的數據當成字符,把set1的字符對位轉換set2的字符

###  tr  [a-z]  [A-Z] < /etc/issue         把/etc/issue中的所有字符轉化爲大寫並輸出到屏幕上

blob.png

tr  -d '[A-Z]' < /etc/issue   把/etc/issue 中的大寫字母移除

Here Document:  <<

cat << EOF

cat > /tmp/out.txt <<EOF

命令參數

  • -c或——complerment:取字符集的補集 

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

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

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





管道:|   

    連接程序,實現將前一個命令的輸出直接定向後一個程序當作輸入數據流

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


    blob.png

     blob.png    



tee命令:

#命令1 | tee 文件名 | 命令2 

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


使用: 

    保存不同階段的輸出 

    複雜管道的故障排除 

    同時查看和記錄輸出


因此可以定向到多個目標,比如要在屏幕顯示,又要保存到磁盤,那麼

[root@localhost etc]# ls /etc/ | tee /tmp/out.txt | tr 'a-z' 'A-Z'

blob.png


將command結果輸出到屏幕上,又保存了一份在磁盤上,由於tr名字在最後執行,因此結果如下

blob.png 




實戰訓練


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

    cat /etc/issue | tr 'a-z' 'A-Z' > /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 $USER ,the system version is `cat /etc/centos-release`,please help me to  check it ,thanks!

> eof


blob.png


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

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


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

    cat file1 | tr ' ' '+' | bc


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

    tr -d '\r' < 1.txt | tee 2.txt


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

    echo $"xt.,l 1 jr#-limn2 c*/fe3 uz4" |  tr -d [:alpha:],[:punct:]


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

    echo $PATH | tr ':' '\n


9、刪除指定文件的空行 

    cat lss | tr -s '\n'


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

    cat lss |tr ' ' '\n'| tr -s '\n'


發佈了62 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章