Linux中IO重定向和管道

IO重定向和管道
         根據馮諾依曼原理的知識,計算機運行有數據流的輸入和輸出,稱之爲IO.
         Linux中一切皆文件思想,表現爲具體的文件。
         在linux中打開的文件都有一個fd(File Descriptor):文件描述符
         程序:指令+數據
                 讀入數據:Input
                 輸出數據:Output

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

一、 標準輸入(STDIN): -0 默認爲接受鍵盤輸入
二、 標準輸出(STDOUT):-1 默認爲輸出到終端窗口
三、 標準錯誤(STDERR):-2 默認爲輸出到終端窗口
注:標準錯誤是解釋器輔助輸出,並非命令自己輸出。
I/O重定向:改變默認數據流向linux

重定向

STDOUT和STDERR能夠被重定向至文件
格式:命令 操做符號 文件名
原有內容被覆蓋:
1.>或1>:將標準輸出重定向至文件,文件原內容被覆蓋,1>前面的1能夠省略。
2.2>: 把標準錯誤重定向至文件
原有內容保留,其後追加:
1.1>>或1>>:把STDOUT重定向至文件,在文件原有內容後追加
2.2>>: 把標準錯誤重定向至文件,在文件原有內容後追加git

合併STDOUT和STDERR重定向至同一文件:
&>:把STDERR和STDOUT一塊兒重定向至文件,文件原有內容會被覆蓋
&>>:把STDERR和STDOUT一塊兒重定向至文件,在文件原有內容後追加
COMMAND > FILE.OUT 2&>1:將STDOUT覆蓋重定向至FILE.OUT,並將STDERR轉化爲STDOUT,結果爲STDOUT和STDERR一同被覆蓋重定向至FILE.OUT;
COMMAND >> FILE.OUT 2&>1:將STDOUT追加劇定向至FILE.OUT,並將STDERR轉化爲STDERR,結果爲STDOUT和STDERR一同被追加劇定向至FILE.OUT
set -C: 禁止覆蓋重定向
set +C:解除禁止覆蓋重定向 面試

|:強制覆蓋重定向
標準輸出和錯誤輸出分別重定向到不一樣文件中:
COMMAND > /PATH/TO/FILE.OUT 2> /PATH/TO/FILE.ERROR
合併輸出流重定向,是2&>1仍是1&>2,順序很重要;
多個命令合併輸出,須要加括號(CMD1;CMD2...)>file

特殊設備:/dev/null
eg:head -1 /etc/passwd &> /dev/null 加上命令echo $?斷定是否成功執行。shell

重定向標準輸入:
COMMAND < FILE.IN
cat < file1 > file2
將file1中的內容覆蓋重定向至file2
cat < file1 >> file1
將file1的內容追加劇定向至file1,若是不中止該命令會一直循環執行下去。(快速生成大文件)
多行輸入重定向:小程序

Here Document:<<EOF(此處EOF稱爲終止符End Of File即告訴程序內容輸入完畢。)
LINE1
LINE2
...
EOF ide

tr命令:

功能:轉換或刪除字符的處理工具
格式:tr [OPTION]..SET1 [SET2]
把輸入的數據當中的字符,凡是在SET1定義範圍內出現的,經過對位轉換爲SET2出現的字符
選項:
-c -C --completment:取字符集的補集
-d --delete:刪除全部屬於SET1字符集中的字符
-s --squeeze-repeats:把全部連續重複的字符以單獨一個字符表示
-t --trucate-set1:將SET1中的字符集對應轉換爲SET2中的字符集
用法1:
tr SET1 SET2 < /PATH/FROM/SOMEFILE
用法2:
tr -d SET1 < /PATH/FROM/SOMEFILE
注意:不修改原文件
a、替換字符:tr a-z A-Z </etc/issue
b、刪除字符:tr -d 'abc' < /etc/issue 工具

特殊字符集:
[:alnum:]:字母和數字
[:alpha:]: 大寫和小寫字母
[:upper:]:大寫字母
[:lower:]: 小寫字母
[:digit:]: 數字
[:punct:]:標點符號
[:graph:]: 圖形字符
[:print:]:可打印字符
[:space:]:空白字符
[:cntrl:]: 控制(非打印)字符
[:xdigit:]:十六進制字符
寫法:
tr 'a-z' 'A-Z'
將需處理文本中的小寫字母轉換爲大寫字母
tr 執行時,
若是字符個數SET1>SET2,則轉換時SET2中最後一位字符做爲SET1中最後幾位沒法一一對應字符的轉換字符;
Linux中IO重定向和管道
若是字符個數SET1<=SET2,則轉換時一一對應OKspa

管道

概念:使用管道命令能夠將多個命令鏈接到一塊兒,將 | 前面的命令的執行結果輸出到 | 後面的命令,做爲它的輸入,能夠實現多種工具組合以完成複雜任務
格式:COMMAND1 | COMMAND2 | COMMAND3 | ...
功能:將命令1的標準輸出做爲命令2的標準輸入,命令2的標準輸出做爲命令3的標準輸入
STDERR默認不能經過管道轉發,但能夠經過&>或2>&1實現
管道中最後一個命令會在當前shell進程的子shell進程中執行
pstree -p 查看
舉例: ls | tr 'a-z' 'A-Z'
此命令將ls的輸出結果發送給tr命令,從而實現將顯示出的當前目錄下的文件名由小寫轉爲大寫的功能
典型用法:echo "pwssword1" | passwd --stdin user1code

重定向到多個目標

格式: COMMAND1 | tee [-a] FILE | COMMAND2
功能:將命令1的STDOUT輸出到FILE中,並做爲COMMAND2的輸入
做用:
可同時查看和記錄輸出
保存不一樣階段的輸出
複雜管道的故障排除
屢次管道輸出,體現linux思想,組合小程序實現複雜功能
df -h|grep "\<[0-9].*" df.txt | tr -s " " ":"|cut -d: -f5|sort -un|tail -1
附加:某面試題:
如下四個哪一個結果不同
1 cmd &> file
2 cmd > file 2>&1blog

3 cmd 2>&1 > file xxx

4 cmd 2>file 1>&2

相關文章
相關標籤/搜索