輸入輸出重定向與管道命令

                                        輸入輸出重定向、管道

1.文件描述符: 

   FD: 內核用來追蹤在內存中已經打開的文件的屬性(標識),是一個內存結構,

       需要空間來存放此信息

2.標準輸入輸出

   INPUT : 標準輸入: stdin ,  描述符 : 0

   OUPUT: 標準輸出: stdout          1

   錯誤輸出 : stderr              2

3.  I/O 重定向

    1). 輸入重定向  :  <      (輸入沒有覆蓋的概念)

        << [EOF封裝]: 此處創建文件

        常用於在腳本中創建文件或者生成菜單

        eg:        #生成菜單

        cat << EOF

        a: show a

        b: show b

        c:  show c

        EOF

        --------> a: show a

        b: show b

        c:  show c

        #把腳本生成的信息輸出生成一個文檔

        cat 》 /path to file.txt  << EOF

        a: show a

        b: show b

        c:  show c

        EOF

    2).輸出重定向 :   > (覆蓋輸出)    >> (追加輸出,不覆蓋原內容)

    3). 強制覆蓋重定向輸出:     >|

    4). 錯誤重定向  : 2> (覆蓋輸出)   , 2>>(追加輸出)

     5).全部信息重定向 :合併標準輸出和錯誤輸出爲同一個數據流進行重定向

            &>  :  (正確和錯誤信息都定向)

                               等效於  cmd > /path   2>&1

                                &>>:追加重定向

     6).支持同時重定向標準的正確和錯誤輸出 :

        cmd > /path to 1  2> /path to 2   (分別把正確、錯誤信息輸出到指定文件)

    7).    ( ):合併多個程序的STDOUT (用;分號分割)

        ( cal 2007 ; cal 2008 ) >  all.txt

     8).   多行重定向:  用<<eof    .....    eof  封裝

        eg: cat f1 <<eof

        kdkdk

        kdkdk

        eof (必須是獨立的一行,不可以有空格等)

        ------》實現重定向

    9).禁止使用覆蓋重定向特性 :       set -C

        回覆特性:     set +C

        強制覆蓋重定向輸出:     >|     (在已經設置禁止覆蓋時強制覆蓋重定向)

        注意: 輸出重定向只能用於正常的輸出,無法用於錯誤輸出

    10)./dev/null   bit bucket :位桶   ,用於丟棄任何輸入到其中的數據

    11).命令執行狀態結果:   使用 $?  

       執行正確: 0     錯誤:非零值

       自定義退出:

        exit [n]

4. 管道:   類似輸出重定向的特殊實現,可以實現多重使用

    1) .管道(使用符號“ |”表示)用來連接命令

        命令1 | 命令2 | 命令3 | …

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

        STDOUT發送到命令3的STDIN

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

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

        注意: 無法傳遞前面命令生成的變量並傳遞到最後的命令中,最後的命令是在子

               shell中運行,已經不處於前面生成變量的作用範圍

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

    2). 管道中實現即輸出到顯示端又輸出到後續命令的實現: T 管道

     命令  tee  

    用法: 緊跟在需要做雙向輸出的命令後面

    eg: cat /file | tee /tmp/abcd | wc -l       #顯示file的內容並且放在/tmp/abcd文

    件中,同時輸出給wc命令 顯示行數

3. tr :   轉換 或者 刪除

    格式: tr [option]  SET1 [SET2]

    -c  補集 (除了匹配內容之外的內容)

    -d 刪除符合SET1中的字符

    -s  壓縮 ,將重複的字符壓縮爲一個字符顯示

    -t   當對應轉換時,後面字符組位數比前面小時,只轉換後面字符組對應的位數,

    多出的不管

    \t  水平的tab

    \v 垂直的tab  可以實現階梯狀

    對應轉換:  ‘abcd’ 'efgh'

    a->e  b->f 以此類推

    ‘abcd’'efg'

(注意 :當後面的字符位數不足時,把最後的g作爲前面d的轉換對象)

習慣上>後面接的是文件,| 後面是跟着命令,若是>後面跟着命令,有可能會把命令當做文件名.


練習:

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

cat /etc/issue | tr "a-z" "A-Z" > /tmp/issue.out

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

whoami  | 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!

操作系統版本信息

echo -e "Hello, i am `whoami` ,the system version is here,please help me to check it ,thanks! \n

`lsb_release`" > mail -s "help" liux

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

ls -m /root | tr , \b

或者:   ls /root | tr '\n'  ' '

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

echo "1 2 34 5 6 7 8 9 10" > file1

echo $[cat file1 | tr ' ' '+']

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

cat a.txt | tr -d '\r'     (windows 中,文件中換行會顯示爲^M)

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

和空格

echo 'xt.,l 1 jr#!$mn2 c*/fe3 uz4' | tr -cd '[:digit:] \n'

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

echo $PATH | tr : '\n'

9、刪除指定文件中重複的空行

cat file | tr -s '\n'

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

tr -cs '[:alpha:]' '\n'


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