RHEL-用戶基礎-重定向

主要概念:

1.基於終端的程序往往從一個源讀取信息,向一個目的地寫入信息;

2.程序讀取的源被稱爲標準輸入(簡稱爲stdin),通常與終端鍵盤連接;

3.程序寫入的目的地被稱爲標準輸出(簡稱爲stdout),通常與終端顯示器相連;

4.使用bash Shell時,可以用>或>>重定向標準輸出,用<重定向標準輸入;


許多Linux命令從鍵盤讀取輸入,向終端顯示輸出。一個命令的輸出可以用作另一個命令的輸入,從而可以同時使用多個簡單的命令來執行更復雜的任務。


三種類型的程序:

1.圖形程序

圖形程序是爲在X圖形環境中運行設計的。它們希望用戶使用鼠標,並且使用常用的圖形組件,如彈出菜單和按鈕作爲用戶輸入。Firefox網絡瀏覽器就是一種圖形程序。


2.屏幕程序

基於屏幕的程序使用文本控制檯。它們利用整個屏幕熟練地處理文本定位和屏幕刷新。它們不需要鼠標,因此適用於終端盒虛擬控制檯。vi和nano文本編輯器以及links網絡瀏覽器都屬於屏幕程序。


3.終端程序

終端程序以流的形式聚集輸入和顯示輸出,很少刷新屏幕,終端程序以其簡明的特點經常被簡單地稱作命令。ls、grep和useradd屬於終端程序。


例如:

1.用戶elvis使用的機器變得非常緩慢,爲了診斷問題,elvis想檢查當前運行的進程,但是由於機器反應很慢,他現在先蒐集信息,之後再做分析,他把ps aux命令的輸出重定向到文件pusaux.txt文件中,當機器反應快時再回頭檢查這個文件。

[root@host2 tmp]# ps aux > /tmp/sluggish.txt


2.elvis現在不僅想要收集進程信息,還要記錄電腦出現反應遲鈍情況時的時間戳

[root@host2 tmp]# date > psaux.txt | ps aux >> sluggish.txt
[root@host2 tmp]# head sluggish.txt 
Wed Nov  5 19:07:00 CST 2014
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.1  19352  1536 ?        Ss   18:50   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    18:50   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    18:50   0:00 [migration/0]
root         4  0.0  0.0      0     0 ?        S    18:50   0:00 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S    18:50   0:00 [migration/0]
root         6  0.0  0.0      0     0 ?        S    18:50   0:00 [watchdog/0]
root         7  0.1  0.0      0     0 ?        S    18:50   0:01 [events/0]
root         8  0.0  0.0      0     0 ?        S    18:50   0:00 [cgroup]


3.用戶elvis用基於終端的mail命令從鍵盤上給管理員寫了一封電子郵件。mail命令把收件人當做一個參數,主題行可以用-s命令行選項指定,然後從鍵盤上鍵入郵件正文,另起一行上單獨寫一個英語的句號,標誌着郵件正文結束。

[root@host2 /]# mail -s "Computer is sluggish" [email protected]
Hey sysadmin:
I'm sending a list of processes that were running when the computer was running in a separate email.
Thanks!  --elvis
.
EOT


作爲後續回覆信息,用戶elvis可以將記錄在文件sluggish.txt中的ps命令輸出發送出去,他只需重定向mail命令的標準輸入流,使之從文件中讀取就可以了。

[root@host2 tmp]# mail -s "ps output" [email protected] < sluggish.txt



【透過表象看本質:打開文件盒文件描述符】

爲了全面理解進程如何管理標準輸入、標準輸出和文件,我們必須引入文件描述符(file descriptor)這一概念。要從文件讀取信息或向文件寫入信息,進程必須打開這個文件。Linux/Unix進程通過給每個當前被他們打開的文件賦整數值來追蹤這些文件,這個整數被稱作文件描述符。

Linux內核提供了一個簡單的方法,用/proc文件系統來檢查當前運行進程打開的文件和文件描述符。每個進程在/proc下有一個相關的子目錄,以其進程ID命名。進程的子目錄裏有一個叫做fd(file descriptor)的子目錄。在/proc/pid/fd子目錄中,進程打開的每個文件都有一個符號連接。符號連接的名稱是打開文件的整數文件描述符,符號連接解析到被打開文件本身。


例子:

ftp和gnuplot程序都是複雜的程序,因此這幾個例子僅僅介紹了與本節主題相關的程序功能:如果程序是從命令行界面上驅動的,通常可以用簡單的文本輸入和重定向自動驅動這個程序。

1.走出sort命令的困惑

用戶使用sort命令對文本文件zoo中的動物進行排序;

[root@host2 tmp]# ls
zoo
[root@host2 tmp]# cat zoo 
elephant
seal
ape
giraffe
fish
[root@host2 tmp]# sort zoo 
ape
elephant
fish
giraffe
seal
[root@host2 tmp]# sort < zoo
ape
elephant
fish
giraffe
seal


sort命令(以最簡單的形式)讀取文件,並寫入按字母順序逐行分類的內容。像cat命令一樣,當沒有提供任何參數時,sort命令將標準輸入作爲它的輸出。

[root@host2 tmp]# sort
ls
quit
man sort
exit
get me out of this
exit
get me out of this
ls
man sort
quit


2.用戶想用簡單的方法生成機器CPU活動圖。他對vmstst命令很熟悉,這個命令可以對設計系統性能許多參數進行抽樣並製成表格,這個命令採用兩個數字參數:

第一個指定了抽樣時間(以秒爲單位);

第二個指定了要採集的樣本數;

他對後三列很感興趣,這三列是CPU在用戶(us)、系統(sy)和空閒(id)狀態上所花的時間百分比。他從機器上採集了60秒的數據,抽樣檢查每秒鐘的數據。

[root@host2 tmp]# vmstat 1 60 > stats.txt
[root@host2 tmp]# head stats.txt 
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 256156  74520 257560    0    0    38     9   43   73  0  0 99  1  0
 0  0      0 256140  74520 257592    0    0     0     0   27   50  0  0 100  0  0
 0  0      0 256140  74520 257592    0    0     0     0   29   48  1  0 99  0  0
 0  0      0 256140  74520 257592    0    0     0     0   22   40  0  0 100  0  0
 2  0      0 256140  74520 257592    0    0     0     0   25   53  0  0 100  0  0
 0  0      0 256140  74520 257592    0    0     0     0   25   49  0  1 99  0  0
 1  0      0 256140  74528 257592    0    0     0    56   30   55  1  0 99  0  0
 1  0      0 256132  74528 257592    0    0     0    88   48   57  0  2 98  0  0


由於前兩行文本影響了數據圖,用戶在文本編輯器中打卡文件stats.txt,輕而易舉地把它們刪除了。


爲了繪製數據圖,她使用了gnuplot命令,這是一個複雜的繪圖軟件包,使用從終端界面讀取的命令來生成數學函數和數值數據圖。瀏覽了gnuplot在線幫助後,她用下列命令繪製數據圖,生成了一個叫做cpu.png的PNG製圖文件。

#gnuplot
gnuplot>set term png
gnuplot>set output 'cpu.png'
gnuplot>plot 'stats.txt' using 0:13 title "user" with lines,'stats.txt' using 0:14 title "system" with lines,'stats.txt' using 0:15 title "idle" with lines
gnuplot>quit

退出gnuplot命令後,他返回到bash shell,用ego圖像瀏覽器查看數據圖,如圖所示:


由於他想經常生成類似的圖,而且不想每次都痛苦地敲gnuplot的繪圖命令,於是他生成了一個可以用來自動運行gnuplot的腳本,編輯了一個文件cpu_plot.gnuplot,其中包含了所有敲入gnuplot命令:

#cat cpu_plot.gnuplot
set term png
set output 'cpu.png'
plot 'stats.txt' using 0:13 title "user" with lines,'stats.txt' using 0:14 title "system" with lines,'stats.txt' using 0:15 title "idle" with lines


現在,他將腳本重定向爲gnuplot標準輸入來方便地繪製新採集的數據:

#gnuplot < cpu_plot.gnuplot


標準輸入、標準輸出和錯誤輸出的文件描述流:

數據流    描述符    縮寫

標準輸入    0        stdin

標準輸出    1        stdout

標準錯誤    2        stderr


【重定向】


>輸出重定向,覆蓋掉原有內容;稱爲覆蓋輸出

<輸入重定向

>>追加輸出,在原文後追加輸入內容

<<在此處生成文檔(here document)


set -C禁止對已經存在的文件使用覆蓋重定向

強制覆蓋輸出,則使用 >|

set +C關閉上述功能


2>重定向錯誤輸出

2>>追加方式重定向錯誤輸出

&>重定向標準輸出或錯誤輸出至同一個文件(輸出所有)


-----bash中重定向標準輸入、標準輸出和標準錯誤一覽表-----

cmd < file從file重定向標準輸入

cmd > file把標準輸出重定向到file中,如果file存在的話,覆蓋(損壞)它

cmd >> file把標準輸出重定向到file中,如果file存在,附加給它

cmd 2> file把標準錯誤重定向到file,如果file存在,覆蓋(損壞)它

cmd 2>> file把標準錯誤重定向到file,如果file存在,附加給它

cmd > file 2> &1合併標準輸出和標準錯誤,並且重定向到file中(可移植的語法)

cmd >& file合併標準輸出和標註錯誤,並且重定向到file中(方便的語法)


【用/dev/null過濾標準錯誤】

find /var -user elvis 2> /tmp/tmp 
find /var -user elvis 2> /dev/null


因爲elvis的權限有限,var下面的目錄中與用戶elvis有關的子目錄就顯示出來,但更多是保所有權限拒絕的錯誤信息,因此要篩選錯誤;

第一種方法雖然過濾了錯誤信息,但卻多了個用戶並不想要的tmp文件,因此採用了第二種方法過濾;

在這種情況下,當用戶想拋棄信息流時,有經驗的Unix用戶通常會把輸出重定向到一個叫做/dev/null的僞設備中。

/dev/null是一個字符設備節點,就像用在約定的設備驅動中的節點一樣。

當用戶寫入/dev/null時,信息只會被內核拋棄,當用戶從/dev/null讀取時,他們會很快讀完文件。注意,RHEL默認配置下,/dev/null是少數幾個普通用戶有寫入權限的文件之一。


ls /varr > /tmp/var1.out 2> /tmp/var2.out

如果正確就輸出到var1.out,如果錯誤就輸出到var2.out


END有時候也用EOF(End of File)

[root@host2 tmp]# cat << END
> the first line.
> the second line.
> END
the first line.
the second line.
[root@host2 tmp]# cat >> /tmp/file.txt << EOF
> the first line.
> the second line.
> EOF
[root@host2 tmp]# ls
file.txt
[root@host2 tmp]# cat file.txt 
the first line.
the second line.


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