1-6:学习shell之重定向
文章目錄
- 一:標準輸入,標準輸出和標準錯誤
- (1):標準輸出重定向
- A:`>`重定向
- B:`>>`重定向
- (2):標準錯誤重定向
- (3):將標準輸出和標準錯誤重定向到同一個文件中
- (4):標準輸入重定向
- 二:管道
- (1)less命令
- (2)過濾器
- (3)uniq-去除重復行
- (4)wc-打印行數,字數和字節數
- (5)grep
- (6)head/tail-只看開頭或結尾
- (7)tee-從stdin讀取數據,同時輸出到stdout(沒有文件參數)或文件
要說命令行中最酷的內容是什么,我覺得是 重定向與 管道
重定向可以把命令行的輸入重定向為從文件中獲取內容,也可以把命令行的輸出結果重定向到文件中
管道可以將多個命令行關聯起來
一:標準輸入,標準輸出和標準錯誤
一個命令或程序,按下回車鍵后,要么會顯示程序運行的結果,要么會顯示狀態和錯誤信息。
以ls為例,當按下ls命令后,它會把其運行結果發送到一個稱為標準輸出(stdout) 的特殊文件中,其狀態信息則會發送到一個稱為 標準錯誤(stderr) 的文件中。標準輸出和標準錯誤都將會被鏈接到屏幕上,然后輸出,它不會保存在磁盤中
我們都知道命令是通過鍵盤輸入給電腦的,這個鍵盤叫做的標準輸入(stdin)
在默認情況下,標準輸入和標準輸出都是按照這樣的邏輯進行的,而I/O重定向功能可以改變輸出內容的發送目的(也就是不讓你發送到屏幕上),也可以改變輸入內容的來源地(也就是說甚至可以來自于文件)
總之,通常來說輸出內容在屏幕上,而輸入內容來自于鍵盤,但是重定向可以改變這種邏輯
(1):標準輸出重定向
標準輸出重定向符號是>’或>>,它表示把左面的內容重定向到右面。
A:>重定向
如下,使用ls命令,把ls命令輸出的內容重定向到a.txt
剛才的指令是正確的的,因為ls命令的列出的目錄是存在的,但是現在我們改變一下。我們將一個根本不存在的目錄,進行重定向
結果在意料之內,它的確是不存在的,但是還有一個很奇怪的問題,既然這個目錄是不存在的,那么為什么最終這個a.txt還是生成了?
接著我們利用長列表顯示這個文件
更奇怪的事情發生了,這個文件的大小竟然是0。使用重定向“>”,進行重定向時,目的文件會從文件開頭部分進行重寫,但是上面咋們ls了一個根本不存在的目錄,所以當重定向重寫這個文件時,在出現錯誤的情況下停止了操作,因此文件內容被刪除,而文件沒有刪除
- 因此,這給我們一個啟發,需要創建新的空文件或者刪除文件內容時可以使用這種方法
B:>>重定向
上面的>重定向只能從文件頭部開始重寫,有時會導致文件內容被刪除,而使用>>重定向可以實現從文件的尾部開始添加輸出內容
為了驗證這一點,我們先用剛才的>重定向,將正確的內容重定向三次
可以發現即便正確重定向了三次,最終文件的大小也只能是54個字節
但是同樣方式利用>>完成,依然正確重定向三次,可以發現大小變為原來的三倍,也就是162個字節
- 從某種方面理解,你可以將>重定向理解為覆蓋重定向,而把>>重定理解為追加重定向
(2):標準錯誤重定向
前面,我們在故意錯誤重定向時,還發現了一個奇怪的地方
這個錯誤信息為什么被輸出到了屏幕上,難道它不應該作為一種日志類的信息添加到文件中嗎?
其實這個問題在前面也能的到解答,ls命令不會把它的錯誤信息發送到標準輸出文件中,而重定向到了標準錯誤文件中,這里我們只干了一件事情那就是重定向了標準輸出,所以自然而然它就輸出到了屏幕上
沖向標準錯誤時和前面的有所不同,簡單點來說:重定向時要加對應索引,0表示標準輸入,1表示標準輸出,2表示標準錯誤,所以要重定向標準錯誤時可以這樣做
(3):將標準輸出和標準錯誤重定向到同一個文件中
一般情況下,我們重定向時要同時重定向標準錯誤和標準輸出(畢竟是日志信息嘛)
只需借助&>就可以同時重定向標準錯誤和標準輸出
(4):標準輸入重定向
這里先介紹一下cat命令,后序會有更好的標準輸入命令,因為cat命令其實很模糊,有的時候使用并不詳細,但是有一個作用一定要記得,對于函數不是太長的文件,可以使用它查看
cai命令命令準確點將是用來合并的文件。舉個例子,在互聯網上下載電影,并不是把這個電影一次性全部搞下來,而是分段下載,這些文件可能較movie.avi1,movie.av2,movie.av3·········,如果使用cat命令,則利用通配符可以一次性把這些文件全部合并
cat movie.avi* >movie.avi上面的cat帶有參數,如果這里直接只輸入一個cat命令,會發現光標閃爍,正在等待我的輸入
此時隨便輸入一些文字
然后按下ctrl+D,告知cat已經到達了文件尾了
由于缺少文件名,因此cat會把標準輸入內容復制到標準輸出文件(此時的標準輸出文件就是屏幕),因此你會看到重復。
現在我們加上文件名,再利用輸出重定向,于是我們就做出了世界上最簡單的文字處理器
再次使用cat查看文件(這里可就可以解釋為什么cat具有查看文件內容的作用了,它會把文件復制到標準輸出中)
到現在我們知道了,cat默認的標準輸入來源鍵盤,因此如果我在這里使用<,右面跟上文件名,那么標準輸入源就成為了該文件。
二:管道
從第一部分的敘述我們可以得知:命令從標準輸入獲取數據,然后把數據再發送到標準輸出,這個過程本質其實是兩個過程,但是為什么感覺執行的時候感覺是一瞬間的呢?這其實利用了管道。
使用管道操作符“|”可以把一個命令的標準輸出發送到另一個命令的標準輸入中 Command 1 | Command2
(1)less命令
less命令可以接受標準輸入,使用less命令可以分頁顯示任意命令的輸入,該命令可以分頁顯示任意命令的輸入,并將其結果發送到標準輸出(屏幕)
如下輸入ls -l /usr/bin | less
你可以把上述理解為這樣:ls -l /usr/bin > test.txt,然后less test.txt
(2)過濾器
管道可以完成復雜的操作,管道左側的內容發送到管道,然后右側進行操作,右側操作完成之后,再傳遞給更右側,有點像過濾的感覺,所以稱為過濾器
如下ls /usr/bin | sort | less,表示將/usr/bin的內容發送到管道,然后sort處理管道內容,再交給less,接著less把內容發送到屏幕,所以你看到的將是一個排序好的文件
(3)uniq-去除重復行
uniq命令可以去除一些重復的行,比如下面的文件中我故意設置了一些很多行
首先使用cat命令,將其發送到屏幕,此時內容將作為標準輸入發送到管道,接著uniq對管道內容進行處理,然后交給less查看。
- 注意uniq -d表示只查看重復行
(4)wc-打印行數,字數和字節數
wc在沒有任何文件參數時,默認以鍵盤作為標準輸入源。
下面是wc和管道的配合使用
(5)grep
grep功能非常強大,你可把它簡單的理解為抓取某些字符,grep不止可以匹配簡單的字符,配合正則表達式,將會達到你意想不到的結果,但是本節只是展現一下其基本的用法
如下,配合管道,我可以將文件中具有包含zip行的文本列出來
如果在輸入加上選項-n,就可以打印出文本所在行行號
還有其他常用選項,讀者可以進行嘗試
(6)head/tail-只看開頭或結尾
有些文件,你可只需要查看的前幾行或者后幾行,這里head和tail命令可以幫助你完成,head和tail默認會輸出文件的前10行和后10行
如果需要改變行數,在后面只需要加上-n即可,n代表行數
其中tail有一個-f選項十分有用,可以查看正在被寫入的日志文件的進展狀態。
比如,/var/log下的message文件包含安全信息,它會時常更新,所以可以用tail -f進行監視(可能要提高用戶等級才能操作),如sudo tail -f /var/log/messages
(7)tee-從stdin讀取數據,同時輸出到stdout(沒有文件參數)或文件
前面我們用管道時,管道后面的命令直接可以操作管道里的內容,但是現在我需要把管道里的東西保存到某個文件中(如果tee后面不加任何參數,那么默認就到標準輸出文件,也就是屏幕)該怎么辦呢?可以使用tee命令完成
總結
以上是生活随笔為你收集整理的1-6:学习shell之重定向的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (计算机组成原理)第二章数据的表示和运算
- 下一篇: HDU 1054 Strategic G