1. 程式人生 > 其它 >Linux IO重定向

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選項輸出使用。

範例: