日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1-6:学习shell之重定向

發布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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之重定向的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。