Linux IO重定向
1.重定向概述
1.1什麼是重定向;
將原本要輸出到螢幕的資料資訊,重新定向到某個指定的檔案中。
1.2重定向使用的場景;
1.當螢幕輸出的資訊很重要,而且希望儲存重要的資訊時;
2.後臺執行中的程式,不希望他干擾螢幕正常的輸出結果時;
3.系統的例行命令, 例如定時任務的執行結果,希望可以存下來時;
4.一些執行命令,我們已經知道他可能出現錯誤資訊, 想將他直接丟棄時;
5.錯誤日誌與正確日誌需要分別輸出至不同的檔案儲存時;
1.3學習重定向的基本知識;
在Linux上面開啟一個程式的時候,通常會自動開啟三個檔案,分別是標準輸入,標準輸出,錯誤輸出。
1.首先程序是無法直接訪問硬體,需要藉助核心來訪問檔案;而核心 kernel 需要利用檔案描述符 (filedescriptor) 來訪問檔案。
2.檔案識別符號:
3.總結:程序--通過-->檔案描述符(非負整數)--訪問-->檔名稱--通過-->自身inode(存放著原始檔案路徑資訊)讀到了軟連結資訊--找到了--原始檔案;檔案識別符號,本質上就是一個軟連結。
ll /proc/$$/fd #當前執行終端程序執行的資訊,每開啟一個檔案,都會自動分配0、1、2這三個數字。
4.程序將從標準輸入中得到資料,將正常輸出列印至螢幕終端,將錯誤的輸出資訊也列印至螢幕終端。
PS: 程序是使用檔案描述符(file descriptors)
來管理開啟的檔案
例如:
第一步:執行 tail -f /etc/passwd
第二步:通過檔案描述符3 -->/etc/passwd檔案-->inode資訊--> block資料塊
第三步:正確輸出---> 預設情況下通過檔案描述 1 ---> 當前終端 1>(改變輸出的位置,指定檔案、黑洞/dev/null)
第四步:錯誤輸出--> 預設情況下通過檔案描述2 --->當前終端 2>
通常程式訪問一個檔案至少會開啟三個標準檔案,分別是標準輸入、標準輸出、錯誤輸出。
程序將從標準輸入中得到資料,將正常輸出列印至螢幕終端,將錯誤的輸出資訊也列印至螢幕終端。
2.輸出重定向案例
輸出重定向,改變輸出內容的位置。輸出重定向有如下幾種方式,如表格所示。
2.1標註輸出重定向
PS:> /etc/passwd =後面直接跟檔案,這樣做直接會將檔案清空,是個危險的操作。
3.輸入重定向案例
輸入重定向:指的是 ”重新指定裝置“ 來 “代替鍵盤” 作為新的輸入裝置。
3.1通過輸入重定向讀入檔案內容;
3.2通過輸入重定向讀入多行內容;
3.3指令碼輸入重定向
使用輸入重定向列印安裝服務的選單導航欄;
3.4輸入重定向使用場景
1.恢復資料的時候;
2.指令碼列印選單時會用到;
3.cat寫入檔案時;vim
4.程序管道技術
概念:管道操作符號 “ | ”,主要用來主要用來連線左右兩個命令, 將左側的命令的【標準輸出】,交給右側命令的【標準輸入】。
示例1:awk -F: '{print $7}'/etc/passwd |sort |uniq -c ==統計當前 /etc/passwd 中使用者使用的shell 型別
示例2:sort -t":" -k3 -n/etc/passwd |head ==將 /etc/passwd 中的使用者按 UID 大小排序
示例3:ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}' ==列印當前主機所有網絡卡的ip地址
PS:前者命令的標準錯誤輸出,無法傳遞!!!
4.管道中使用tee
tee:命令用於將資料重定向到檔案,同時提供一份重定向資料的副本作為後續命令的標準輸入。簡單地說就是把資料重定向到指定檔案和螢幕上(多重定向)。
-a :向檔案追加內容,而不是覆蓋。
範例:
5. 管道中使用xargs
引數傳遞,主要讓一些不支援管道的命令可以使用管道技術。
xargs命令是向其他命令傳遞命令列引數的一個過濾器,能夠將管道或者標準輸入傳遞的資料轉換成xargs命令後跟隨的命令的命令列引數。
選項:
-n 指定每行的最大引數量n,可以將標準輸入的文字劃分成為多行,每行n個引數,預設空格為分隔符。
範例:將30個數字,每行10個排序。
-i 以{}替代前面的結果
範例:將find查詢到的檔案,用移動到/data目錄下。
-I (大寫I)指定一個符號代替前面的結果,不用-i預設的{}
範例:用“[]”代替前面的結果,然後拷貝到/root/目錄下。
-d 自定義分割符
範例:將“:”作為分割符,每行做多輸出4個。
-0 (數字0)用null代替空格作為分隔符,配合find命令的-print0選項輸出使用。
範例: