Linux重定向和管道的基礎學習

重定向和管道

 

本章節內容:

   三種I/O設備

   把I/O頻道重定向入

   使用管道鏈接命令

 

一、標準輸入和輸出:

  程序:指令+數據

讀入數據:Input;輸出數據:Output

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

 

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

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

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

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

 

I/O重定向:改變默認位置

不是所有的標準輸入都有標準輸出;標準輸出是默認的當前終端窗口。


三種合併正常輸出流和錯誤輸出流的方法:

wKiom1edUr3AAZOmAAGYARm5YuQ792.png-wh_50 

wKioL1edUtOQn89kAADpsj4m4j4206.png-wh_50

二、將輸出和錯誤輸出重新定向到文件:


標準輸出和錯誤輸出可以被重定向到文件:

命令操作符號文件名


支持的操作符號包括:

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


瞭解重定向的使用:

1> 把標準輸出重定向到文件(文件內容會被覆蓋);>> 原有內容基礎上,追加內容;

wKiom1edUxfwAhU9AAAOASIBKNI497.png-wh_50

wKioL1edUyqzJmLNAAAcDo4pJxY216.png-wh_50

22>把錯誤輸出重定向到文件;2>>: 追加重定向錯誤輸出數據流;

wKioL1edU0GzNhVWAAAafWZ8k8Y773.png-wh_50

3&>把合併所有輸出重定向到文件;&>>:追加重定向

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

COMMAND >> /path/to/file.out2>> &1

  

新的寫法(&>),入下圖:

wKiom1edU3LSlO01AAATBgs5qmI131.png-wh_50 

以前舊的寫法(2>&1),入下圖:

wKiom1edU4aztDyLAAAnVA65R6Q626.png-wh_50

禁止覆蓋:(針對當前終端有效)

# set -C: 禁止將內容覆蓋已有文件,但可追加(>>

wKioL1edU7TSUZKmAAAunjxav2A700.png-wh_50

強制覆蓋:>|

wKioL1edU8ihQ3MBAAAP05mbk94617.png-wh_50

# set +C: 允許覆蓋


4、合併多個程序執行的結果重定向,命令格式爲:(COMMAND;COMMAND > /path/filename

wKiom1edU-3h9lsLAAAfe6yMLKY073.png-wh_50

5、使用字符給系統用戶寫郵件,格式:# mail –s 標題用戶名

回車後,等待內容的輸入,結束以“.”,切記.的前面不能夠空格。

wKiom1edVBeDgq6JAAALHh9YL70132.png-wh_50

用戶chesfer查看來自root用戶發給其的郵件,如下圖:

wKioL1edVC2hBJiaAAA6vdQm-3k774.png-wh_50


6、多行輸入重定向的開始/結束符:<<EOF /  >EOF

  wKiom1edVEbwcyhyAAAUo_XG7iI013.png-wh_50

 

三、認識和使用tr命令:


tr–轉換和刪除字符

使用格式: tr[OPTION]...SET1 [SET2]

使用選項:-c或——complerment:取字符集的補集

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

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

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

wKiom1edVILCTcaeAAATvfPdxP8871.png-wh_50

tr –c使用:如下圖,將不是ab的字母全部給轉換成n

wKioL1edVJaSk_-LAAAnD-4sf94593.png-wh_50

四、管道:只能接收標準輸出,而不能接收錯誤輸出。

  

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


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


STDERR默認不能通過管道轉發,可利用2>&1 | |& 實現(無法判斷前面的COMMAND是否成功)

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

 

1、組合多種工具的功能使用,如下:

  eg: ls /etc/ | tr 'a-z' 'A-Z'

  wKiom1edVN7h6KM0AAAd5sv8Nso903.png-wh_50


2# who | tee | tr 'a-z' 'A-Z'

wKiom1edVPLAvEy5AAAeh1TkrAg015.png-wh_50


3# ls-l/etc|less一頁一頁地查看輸入:


  wKioL1edVQrBNnxbAABjcE328hM212.png-wh_50

 

練習與作業:

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

tr [[:lower:]] [[:upper:]] < /etc/issue >//tmp/issue.out

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

# w | tr [[:lower:]] [[:upper:]] > /tmp/who.out

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

操作系統版本信息

   mail help root <<EOF

  <Hello, I am chesfer(`id -un`),the system version is here,pleasehelpme to check it ,thanks!

  <`cat /etc/centos-release`

  <EOF


wKioL1edVSfBtCwfAAAU3YKlK1M897.png-wh_50

wKiom1edVTyhmmiJAABPGRueH_c611.png-wh_50

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

  # ls/root/ | tr ‘\n’ ‘ ’

  wKioL1edVVCyghe4AAATxXbGJXw702.png-wh_50

 

 

作業:

 

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

   wKioL1efGpjw2a51AAAKyRBb5-I813.png-wh_50

   # cat file1 |tr  " " "+ " | bc

  wKioL1efGmmDI-IpAAAHiepRgNI290.png-wh_50

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

  #cat-A f11.ext

  #dos2unix f11.txt 

  wKiom1ednUjCtbWqAAAXArufjik811.png-wh_50

  

7、處理字符串“xt.,l 1jr#!$mn2 c*/fe3 uz4”,只保留其中的數字和空格

   # catfiles | tr -d [[:alpha:]][[:punct:]]

 wKiom1edVcbRc5vZAAAGs0WR1Dc803.png-wh_50

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

   #echo $PATH | tr ":" "\n"

 wKiom1edVdzA8ky2AAAOVoygJT4208.png-wh_50

9、刪除指定文件的空行

 wKiom1edVfGhIgsbAAALgM8Gdfk062.png-wh_50

  # #cat fs | tr -s [[:space:]]

 wKioL1edVg7Ro8R4AAAIyILzdiQ808.png-wh_50

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

 wKioL1edVifxWbuPAAALgM8Gdfk107.png-wh_50

  #cat fs | tr [[:space:]] '\n' | tr -s [[:space:]]

 wKiom1edVj2jeHHkAAALscwcbw8843.png-wh_50

11、軟、硬鏈接區別

 軟鏈接:兩個文件名擁有兩個不同的inode節點號;指向兩塊不同的數據塊;兩個文件名是一個“主 從”的關係;其中任何一個刪除,對另外的文件名沒有任何的影響;每增加一個文件名,inode節點號上的鏈接數增加一個,反之,刪除一個文件名,鏈接數減一,直至爲零,inode節點號和數據塊纔會被回收;鏈接的文件名數據塊上只是存放源文件名的訪問路徑;可以對目錄進行軟鏈接;可以跨分區創建鏈接;可以對不存在的文件名創建鏈接;鏈接方式上爲ln -s 源文件 鏈接名


 硬鏈接:兩個/多個文件名只能擁有同一個inode節點號;指向同一塊的數據塊;兩個或多個文件名是一個“平等”的關係;其中任何的一個刪除掉,另外的一個雖然存在,但其指向的鏈接是一個無效的鏈接;不能夠對目錄進行鏈接;不能跨分區創建鏈接;不能夠對不存在的文件名創建鏈接;鏈接方式上爲ln 源文件 鏈接名




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