Linux運維學習歷程-第六天-Linux重定向和管道
2
本章內容我們將學習linux中的重定向和管道兩大用法
I/O輸入與輸出設備
重定向
管道
tee命令與tr命令
一、I/O設備
1、什么是I/O設備
管理和控制計算機的所有輸入/輸出(I/O)設備是操作系統的主要功能之一,主要分為字符設備和塊設備。一般由機械和電子兩個部分組成。
功能介紹
輸入/輸出(Input /Output ,簡稱I/O),指的是一切操作、程序或設備與計算機之間發生的數據傳輸過程。
輸入/輸出系統(Input/Output System) ,指控制計算機數據流動的體制,包括程序、硬件。
輸入/輸出設備,就是指可以與計算機進行數據傳輸的硬件。
最常見的I/O設備有打印機、硬盤、鍵盤和鼠標。從嚴格意義上來講,它們中有一些只能算是輸入設備(比如說鍵盤和鼠標);有一些只是輸出設備(如打印機)。
所有儲存器也可以算是輸入/輸出設備。如硬盤、軟盤、光盤等。
I/O設備分類
現代計算機系統中配置了大量的外圍設備,即I/O設備。依據它們的工作方式的不同,通常進行如下分類:
(1)字符設備(character device),又叫做人機交互設備。用戶通過這些設備實現與計算機系統的通信。它們大多是以字符為單位發送和接受數據的,數據通信的速度比較慢。例如,鍵盤和顯示器為一體的字符終端、打印機、掃描儀、包括鼠標等,還有早期的卡片和紙帶輸入和輸出機。含有顯卡的圖形顯示器的速度相對較快,可以用來進行圖像處理中的復雜圖形的顯示。
(2)塊設備(block device),又叫外部存儲器,用戶通過這些設備實現程序和數據的長期保存。與字符設備相比,它們是以塊為單位進行傳輸的,如磁盤、磁帶和光盤等。塊的常見尺寸為512~32768B之間。
(3)網絡通信設備。這類設備主要有網卡、調制解調器等,主要用于與遠程設備的通信。這類設備的傳輸速度比字符設備高,但比外部存儲器低。這種分類的方法并不完備,有些設備并沒有包括。例如,時鐘既不是按塊訪問,也不是按字符訪問,它所做的是按照預先規定好的時間間隔產生中斷。但是這種分類足以使操作系統構造出處理I/O設備的軟件,使它們獨立于具體的設備。
2、I/O設備作用的對象
程序:指令+數據
指令:一般由程序本身提供
數據:I/O設備、文件、管道、變量等提供
當然程序也可以理解為
算法+數據結構
只是分析的領域不同罷了。
那么綜上說,我們不難看出I/O設備在整個計算機系統中主要是對數據產生作用的,而我們在與計算機交互時的主要行為就是輸入Input–>等待運算結果–>輸出Output返回的值
讀入數據:Input
輸出數據:Output
3、linux的I/O設備
打開的文件都有一個FD:file descriptor(文件描述符),在linux中系統為程序提供了三種最常用的I/O設備
標準輸入(STDIN)-0 默認接受來自鍵盤的輸入
標準輸出(STDOUT)-1 默認輸出到終端窗口
標準錯誤(STDERR)-2 默認輸出到終端窗口
0、1、2即為文件描述符
而在linux系統中I/O重定向既是:
重新定義輸入輸出請求,改變默認位置,將其轉向其它位置
二、重定向
Linux重定向
1、輸出重定向:
可以把標準輸出和錯誤結果重新定向到其他文件(linux一切皆文件,包括硬件設備)
STDOUT 和STDERR 可以被重定向到文件:
命令 操作符號 文件名
支持的操作符號包括:
>或1> 把STDOUT 輸出重定向到文件,以正確結果覆蓋原來的文件
2> 把STDERR 輸出重定向到文件,以錯誤結果覆蓋原來的文件
>! 把STDOUT 輸出重定向到文件,以正確結果強制覆蓋原來的文件
&> 把所有輸出重定向到文件,以所得結果覆蓋原來文件
2>&1 將一個標準錯誤輸出重定向到標準輸出
注釋: 1代表 標準輸出(在作用上和 &> 效果一樣 而且順序很重要,固定格式 )
>& 將一個標準錯誤輸出重定向到一個文件或設備 覆蓋原來的文件( c-shell:csh)
注意: > 會將文件原來的內容覆蓋
# set -C: 禁止將內容覆蓋 已有文件, 但可追加
強制覆蓋:>!
# set +C: 允許覆蓋
>> 原有內容基礎上,追加輸出的內容
() :合并多個程序的STDOUT
例如:( cal 2007 ; cal 2008 ) > all.txt
可以利用> 文件名 >> 文件名來重建空文件,效果等同 touch 文件名
建議使用>> 文件名,因為可以防止誤操作覆蓋已有文件的數據
2、輸入重定向
可以把標準輸入重新定向到其他文件(linux一切皆文件,包括硬件設備)
STDIN 重新定向到文件
命令 文件名 操作符號
支持的操作符號包括:
<或0< 把STDIN輸入重定向到文件,覆蓋原來的文件
<< 把STDIN輸入重定向到文件,追加新文件內容到文件
注意:正常標準輸入0的默認設備是鼠標、鍵盤;而 < 可以將文件中的內容輸入到其他文件,所以說輸入重定向
使用“<< 終止詞”命令從鍵盤把多行重導向給STDIN,直到“<<終止詞” 位置的所有文本都發送給STDIN;有時被稱為就地文本(heretext)
示例1:
cat命令
1
|
cat |
從鍵盤標準輸入什么,返回到標準輸出的終端就是什么
1
|
cat test .txt |
從文件中輸入的內容
1
2
|
cat > stdout.txt < test .txt cat stdout.txt |
1
2
3
4
5
|
mail -s hello NameLess <<end #這里回車輸入以下內容 > hello,I am root, > I hope we can talk face to face, > please find me before work today. > end |
注意:<<結束字符 是成對出現的,開始字符是什么,結束字符就是什么,而且必須是單獨一行出現才有效。
示例3:
1
2
3
4
|
1 > stdout.txt '1' > stdout.txt "1" > stdout.txt `1` > stdout.txt |
注意:此種重定向無效,個人分析,單純的字符是沒有數據輸出”動作“,所以無法將內容送達文件,雖然存在 > file或 >> file 來重建空文件,可以理解為將”空“定向到file中,不存在則創建了空文件,但是和上面操作不能一概而論
而且當我們輸入完數據后,輸入動作結束,數據就是存儲在內存(存儲設備)中,既不在硬盤(I/O設備)上,也不是鍵盤(I/O設備)直接輸入的,所以不是輸入輸出,也就不能用重定向啦
此處僅個人理解,如有更專業的解釋,還望各路大神指點
總結:
重定向是針對輸入輸出數據的,所以可以理解為基于I/O設備的操作過程,才能用到重定向
默認鍵盤(I/O設備)輸入數據給命令 我們給它重定向 < 從硬盤(I/O設備)存儲的文件輸入數據給命令
默認終端(I/O設備)輸出數據給用戶 我們給它重定向 > 到硬盤(I/O設備)存儲的文件中,也可以是/dev/tty1-60這些終端中
三、管道
1、進程
在學習管道之前,我們先了解一下”進程“以便我們更好的理解管道的含義和作用
進程(Process)是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
狹義定義:進程是正在運行的程序的實例(an instance of a computer program that is being executed)。
廣義定義:進程是一個具有一定獨立功能的程序關于某個數據集合的一次運行活動。它是操作系統動態執行的基本單元,在傳統的操作系統中,進程既是基本的分配單元,也是基本的執行單元。
進程的概念主要有兩點:第一,進程是一個實體。每一個進程都有它自己的地址空間,一般情況下,包括文本區域(text region)、數據區域(data region)和堆棧(stack region)。文本區域存儲處理器執行的代碼;數據區域存儲變量和進程執行期間使用的動態分配的內存;堆棧區域存儲著活動過程調用的指令和本地變量。第二,進程是一個“執行中的程序”。程序是一個沒有生命的實體,只有處理器賦予程序生命時(操作系統執行之),它才能成為一個活動的實體,我們稱其為進程。
進程是操作系統中最基本、重要的概念。是多道程序系統出現后,為了刻畫系統內部出現的動態情況,描述系統內部各道程序的活動規律引進的一個概念,所有多道程序設計操作系統都建立在進程的基礎上。
原因
操作系統引入進程的概念的原因:
從理論角度看,是對正在運行的程序過程的抽象;
從實現角度看,是一種數據結構,目的在于清晰地刻畫動態系統的內在規律,有效管理和調度進入計算機系統主存儲器運行的程序。
特征
動態性:進程的實質是程序在多道程序系統中的一次執行過程,進程是動態產生,動態消亡的。
并發性:任何進程都可以同其他進程一起并發執行
獨立性:進程是一個能獨立運行的基本單位,同時也是系統分配資源和調度的獨立單位;
異步性:由于進程間的相互制約,使進程具有執行的間斷性,即進程按各自獨立的、不可預知的速度向前推進
結構特征:進程由程序、數據和進程控制塊三部分組成。
多個不同的進程可以包含相同的程序:一個程序在不同的數據集里就構成不同的進程,能得到不同的結果;但是執行過程中,程序不能發生改變。
2、管道與進程
以上就是進程的基本含義,我們說到了進程,就要說管道;
管道的作用:
主要用于進程間通信,能夠協調不同的進程,使之能在一個操作系統里同時運行,并相互傳遞、交換信息。可以組合多種工具的功能。
進程間通信主要包括管道, 系統IPC(包括消息隊列,信號,共享存儲), 套接字(SOCKET).
管道的種類
管道包括三種:
1)普通管道PIPE, 通常有兩種限制,一是單工,只能單向傳輸;二是只能在具有親緣關系的進程,比如父子或者兄弟進程間使用.
2)流管道s_pipe: 去除了第一種限制,為半雙工,可以雙向傳輸.
3)命名管道:name_pipe, 去除了第二種限制,可以在許多并不相關的進程之間進行通訊.
在此篇中我們學習的管道是普通管道PIPE,是一種常見管道,所以以下簡稱為管道了
管道PIPE定義解析:
單工:支持數據單方向傳輸,也就是說只能向一個方向傳遞數據不能反向傳遞。(有數據信息傳輸,網絡等基礎的可以跳過)
具有親緣關系:這個初學者并不好理解,現在我也并不是有太專業的概念,我的理解其實也很簡單,就是進程之間必然有著直接關系,就比如我們用linux時,其實都在一個shell類型(默認為bash)下,所以我們在平時所有的命令看似沒關系,其實基本上都是兄弟,shell的子進程;當然這是我初步的理解,很片面;但是我們只要知道,普通管道PIPE是兩個具有親緣關系的進程才能使用的一種進程通信方式。
在linux命令行中用符號“ | ”代表管道 ,并連接命令
格式:COMMAND1 |COMMAND2 |COMMAND3 …
管道是對標準輸入輸出來說的,對于錯誤結果可以 2>&1 | 或者 |& 可以將標準輸出錯誤重定向到后面命令
格式含義:有COMMAND1命令執行后的stdout通過管道 | 傳遞給COMMAND2作為其stdin數據(參數),依次類推。相當于前一個命令的標準輸出變為后一個命令的標準輸入 進行了兩次重定向
注意:默認正常情況下命令執行的錯誤結果不能通過管道轉發,但可以利用2>&1或|&實現
總結:綜上所述,管道用于進程間通信的,而進程是程序的實體,動態程序的抽象化
所以我們理解為在linux中管道主要用于命令與命令之間通信的,這規定了管道的使用條件。也解釋了為什么管道不能直接作用于目錄(也就是路徑)和文件。
四、tee命令與tr命令
tee命令執行過程可以理解為如圖:
數據輸入(鍵盤、管道傳遞的數據等)——>tr——>數據輸出(文本文件等)
|
|
∨
終端顯示
tee:將數據重定向到文件,另一方面還可以提供一份重定向數據的副本作為后續命令的stdin。簡單的說就是把數據重定向到給定文件和屏幕上。
存在緩存機制,每1024個字節將輸出一次。若從管道接收輸入數據,應該是緩沖區滿,才將數據轉存到指定的文件中。若文件內容不到1024個字節,則接收完從標準輸入設備讀入的數據后,將刷新一次緩沖區,并轉存數據到指定文件。
tee [OPTION]… [FILE]…
-a:向文件中重定向時使用追加模式;
-i:忽略中斷(interrupt)信號。
tr:翻譯轉意或刪除字符
tr [OPTION]… SET1 [SET2]
從標準輸入中替換、縮減和/或刪除字符,并將結果寫到標準輸出。
-c, -C, –complement 首先補足SET1即除了SET1的其它
-d, –delete 刪除匹配SET1 的內容,并不作替換
-s, –squeeze-repeats 如果匹配于SET1 的字符在輸入序列中存在連續的
重復,在替換時會被統一縮為一個字符的長度
-t, –truncate-set1 先將SET1 的長度截為和SET2 相等
SET 是一組字符串,一般都可按照字面含義理解。解析序列如下:
\NNN 八進制值為NNN 的字符(1 至3 個數位)
\\ 反斜杠
\a 終端鳴響
\b 退格
\f 換頁
\n 換行
\r 回車
\t 水平制表符
\v 垂直制表符
字符1-字符2 從字符1 到字符2 的升序遞增過程中經歷的所有字符
[字符*] 在SET2 中適用,指定字符會被連續復制直到吻合設置1 的長度
[字符*次數] 對字符執行指定次數的復制,若次數以 0 開頭則被視為八進制數
[:alnum:] 所有的字母和數字
[:alpha:] 所有的字母
[:blank:] 所有呈水平排列的空白字符
[:cntrl:] 所有的控制字符
[:digit:] 所有的數字
[:graph:] 所有的可打印字符,不包括空格
[:lower:] 所有的小寫字母
[:print:] 所有的可打印字符,包括空格
[:punct:] 所有的標點字符
[:space:] 所有呈水平或垂直排列的空白字符
[:upper:] 所有的大寫字母
[:xdigit:] 所有的十六進制數
[=字符=] 所有和指定字符相等的字符
注意:
僅在SET1 和SET2 都給出,同時沒有-d 選項的時候才會進行替換。
僅在替換時才可能用到-t 選項。如果需要SET2 將被通過在末尾添加原來的末字符的方式補充到同SET1 等長。SET2 中多余的字符將被省略。只有[:lower:] 和[:upper:]以升序展開字符;在用于替換時的SET2 中以成對表示大小寫轉換。-s 作用于SET1,既不替換也不刪除,否則在替換或展開后使用SET2 縮減。
示例1
將/etc/issue文件中內容轉換成大寫字母輸出
1
|
tr 'a-z' 'A-Z' < /etc/issue |
示例2
刪除/testdir/test.txt文件中的所有abc 中任意字符(分區和文件都是我自己建的不是linux默認的)
1
|
tr -d abc < /testdir/test .txt |
示例3
將test.txt文件中的內容輸入重定向到cat命令然后輸出重定向大stdout.txt中
1
|
cat > stdout.txt < test .txt |
示例4
一頁一頁的查看/etc的內容
1
|
ls -l /etc | less |
示例5
把輸入發送給打印機
1
|
echo "test print" | lpr -P printer_name |
原創文章,作者:NameLess,如若轉載,請注明出處:http://www.www58058.com/28146