Linux運維 shell 輸入與輸出

Linux運維相關(四)

學習Linux運維過程中的心得體會以及知識點的整理,方便我自己查找,也希望可以和大家一起交流。

—— shell 輸入與輸出 ——

echo

  • 作用:將一行字符串顯示到標準輸出

  • echo 命令的一些細節在 System V、BSD 和 Linux 這三種 Like-UNIX 系統上不同,這裏以 Linux 系統爲主。

  • Usage: echo [-e] [-n] STRING

    • STRING : STRING 是要輸出的字符串,其中可以包含 shell 變量名、轉義符等,一般用雙引號括起來。
    • -e : Linux 的 echo 缺省不解釋 STRING 中的轉移符,除非加上此選項。
    • -n : echo 缺省在輸出 STRING 後輸出 NEWLINE(換行),使用此選項 echo 將不輸出 NEWLINE。
    • echo 支持的轉移符: \NNN ASCII 碼爲 NNN(8 進制)的字符,NNN 如果不是一個合理的值,將直接按照字面打印
    \a 響鈴
    \b 退格
    \c 去除結尾NWELINE 字符
    \f 換頁
    \n 換行
    \r 回車
    \t 水平製表符
    \v 垂直製表符
    \\ 反斜線
    • 舉例:
      echo -e "User: $USER\tUID: $UID"
      顯示 User: zqf UID: 500

read

  • 作用:從鍵盤或文件的某一行文本中讀入信息,並將其賦給變量。
  • Usage: read varible1 varible2 ...
  • 如果只指定了一個變量,read 將會把輸入行的所有內容賦給該變量,直至遇到第一個文件結束符或回車。
  • 如果指定了多個變量,read 用空格(環境變量 IFS)作爲分隔符把輸入行分成多個域,分別賦給各個變量。
  • 輸入文本分隔出的域數量多於 read 給出的變量數,read 將所有的超長部分賦予最後一個變量。

管道

  • 可以通過管道把一個命令的輸出傳遞給另一個命令作爲輸入。管道用豎槓"|"表示。
  • Usage: command1 | command2
  • 舉例:
    ls | grep "*.c" // 將 ls 命令的輸出作爲 grep 命令的輸入,即在當前目錄下搜索 C 源程序文件
  • sed、awk 和 grep 等程序都很適合用管道,特別是在 shell 命令行下。

tee

  • 作用:它把輸出的一個副本輸送到標準輸出,另一個副本拷貝到相應的文件中
  • Usage: tee -a filename
    • -a : 表示追加到文件末尾。
    • tee 命令應該和管道結合使用
  • 舉例:
    who | tee who.out // who 命令的輸出不僅會輸出到標準輸出,還會輸入到文件 who.out

標準輸入、輸出和錯誤

  • 文件描述符: 文件描述符是從 0 開始的整數,指向與進程相關的特定數據流。當進程啓動時,通常打開三 個文件描述符,分別對應三種標準的 I/O: 標準輸入(文件描述符 0),標準輸出(文件描述符 1),標準錯誤(文 件描述符 2)。
  • 標準輸入(STDIN) : 它是命令的輸入,缺省和終端的鍵盤關聯。
  • 標準輸出(STDOUT): 它是命令的輸出,缺省和終端的屏幕關聯。
  • 標準錯誤(STDERR): 它是命令的錯誤信息輸出,缺省也和終端的屏幕關聯。
  • 如果進程打開了額外的文件進行輸入和輸出,則其被設置爲下一個可用的文件描述符,從 3 到 9。

文件重定向

  • 在執行命令時,命令的標準輸入、輸出和錯誤是和文件描述符 0、1、2 關聯的,而文件描述符 0、1、2 缺 省都和終端關聯。如果希望命令從文件中讀取標準輸入或者希望命令的標準輸出寫到文件而不是屏幕,就需要 使用文件重定向。

  • 重定向標準輸出
    ① CMD > filename : 把 CMD 命令的標準輸出重定向到一個文件中(如果文件存在,其內容將被覆蓋)。
    ② CMD >> filename : 把 CMD 命令的標準輸出重定向到一個文件中(追加文件尾部)。
    ③ > myfile: 創建一個長度爲 0 的空文件,如果文件存在清空該文件。
    ④ 舉例:

    ls -l | grep ^d >>files.out  // 把當前目錄下的子目錄的列表寫到文件 files.out 中          
    > zqf.log                    // 清空日誌文件 zqf.log 
    

    ⑤ CMD > filename 實際上是和 CMD 1> filename 等效,CMD >> filename 和 CMD 1>> filename 等效。

  • 重定向標準輸入
    ① CMD < filename : 以 filename 文件作爲 CMD 命令的標準輸入。
    ② CMD << DELIMITER : 從標準輸入中讀入輸入,直至遇到 DELIMITER 分界符。(here-document)
    ③ 舉例:
    sort < grade.txt // 對文件 grade.txt 進行排序(sort)
    ④ CMD < filename 實際上是和 CMD 0< filename 等效,CMD << filename 和 CMD 0<< filename 等效。

  • 重定向標準錯誤
    ① CMD 2 > filename : 把 CMD 命令的標準錯誤重定向到一個文件中(如果文件存在,其內容將被覆蓋)。
    ② CMD 2 >> filename : 把 CMD 命令的標準錯誤重定向到一個文件中(追加文件尾部)。
    ③ 舉例:
    find / -name "*.tmp" -exec rm -rf {} \; 2>/dev/null // 把命令的錯誤消息輸出丟棄 。

  • 結合使用標準輸出和標準錯誤
    ① CMD 1> file1 2> file2 : 將輸出重定向到 file1 中,並把標準錯誤重定向到 file2 中。

    ② CMD < file1 > file2 : 以 file1 文件作爲 CMD 命令的標準輸入,以 file2 文件作爲標準輸出。

    ③ 舉例:
    find / -name "*.tmp" -print 1>find.out 2>find.err // 把 find 的搜索結果寫到文件 find.out 中,而把 find 命令的錯誤信息(比如沒有足夠權限搜索某些目錄)寫到文件 find.err 中
    cat <1.txt >2.txt // 實際是將 1.txt 的內容寫到 2.txt,等效於文件複製

  • 合併標準輸出和標準錯誤
    ① CMD > filename 2>&1 : 把標準輸出和標準錯誤一起重定向到一個文件中
    ② CMD >> filename 2>&1 : 把標準輸出和標準錯誤一起重定向到一個文件中(追加)
    ③ 舉例:
    grep "standard" * > grep.out 2>&1 // 在當前目錄下所有文本文件中搜索字符串"standard"
    ④ CMD > filename 2>&1 實際上可以看作 2 部分,"> filename"(重定向標準輸出)和"2>&1"(把標準錯誤重 定向到標準輸出)。

  • 在使用一些接受文件名爲參數的命令時,有時命令會把文件描述符當成是文件名參數而報錯。一般文件描 述符和重定向符號之間留有不要有空格。

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