Linux I/O 介紹
Linux內(nèi)置的重定向功能提供了一組強(qiáng)大的工具,便于各種I/O任務(wù)。無(wú)論是通過(guò)命令行執(zhí)行文件管理操作還是通過(guò)軟件來(lái)操作文件,都需要了解各種Linux系統(tǒng)內(nèi)置的I/O流。
流
Linux系統(tǒng)的輸入和輸出分布在三個(gè)stream中:
- standard input (stdin)
- standard output (stdout)
- standard error (stderr)
三種標(biāo)準(zhǔn)流對(duì)應(yīng)的數(shù)字是:
- stdin(0)
- stdout(1)
- stderr(2)
用戶通過(guò)終端與Linux系統(tǒng)交互期間,標(biāo)準(zhǔn)輸入流包括鼠標(biāo)鍵盤(pán)等傳輸;標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤會(huì)議文件形式顯示在終端上,均是標(biāo)準(zhǔn)流。
輸入
標(biāo)準(zhǔn)輸入通常將數(shù)據(jù)從用戶設(shè)備傳輸?shù)较到y(tǒng)程序。而期望標(biāo)準(zhǔn)輸入的程序會(huì)從鍵盤(pán)等設(shè)備接收輸入,通過(guò)特殊標(biāo)識(shí)(EOF)來(lái)終止標(biāo)準(zhǔn)輸入流。EOF表示沒(méi)有更多可讀取的輸入流。
cat程序可以查看標(biāo)準(zhǔn)輸入,cat可以鏈接或者組合輸入,將兩個(gè)文件內(nèi)容進(jìn)行組合。cat單獨(dú)運(yùn)行時(shí)將打開(kāi)循環(huán)提示,啟動(dòng)cat然后通過(guò)鍵盤(pán)輸入一系列字符。
cat
鍵入一系列字符。
lance
linux
tutorials
當(dāng)輸入Enter建時(shí),標(biāo)準(zhǔn)輸入將會(huì)被發(fā)送到cat程序,反過(guò)來(lái)cat程序又會(huì)將輸入作為標(biāo)準(zhǔn)輸出發(fā)送回終端顯示屏。
可以通過(guò)crtl+d輸入EOF標(biāo)識(shí)符來(lái)終止輸入。
輸出
標(biāo)準(zhǔn)輸出是由程序生成的數(shù)據(jù),當(dāng)標(biāo)準(zhǔn)輸出流未重定向時(shí),將會(huì)輸出文本到終端顯示屏。
echo send an tutorials data to server
當(dāng)不帶任何其他選項(xiàng)時(shí),echo命令將在命令行終端顯示傳遞的所有參數(shù),即wcho程序接收到的所有信息。
echo
由于沒(méi)有參數(shù)輸入,將返回一個(gè)空行。
錯(cuò)誤
標(biāo)準(zhǔn)錯(cuò)誤將寫(xiě)入在執(zhí)行某個(gè)失敗的程序所生成的錯(cuò)誤。與標(biāo)準(zhǔn)輸出一樣,默認(rèn)輸出目標(biāo)是終端。
當(dāng)程序標(biāo)準(zhǔn)錯(cuò)誤通過(guò)管道輸出到第二應(yīng)用程序時(shí),管道傳輸?shù)臄?shù)據(jù),即有標(biāo)準(zhǔn)錯(cuò)誤組成的數(shù)據(jù),也會(huì)同時(shí)發(fā)送到終端。
通過(guò)ls命令輸出一個(gè)不存在的目錄內(nèi)容。
ls Empty
由于當(dāng)前目錄下不存在Empty子目錄,所以會(huì)產(chǎn)出標(biāo)準(zhǔn)錯(cuò)誤:
ls: cannot access 'Empty': No such file or directory
重定向
Linux包括每個(gè)流的重定向命令,這些命令將標(biāo)準(zhǔn)輸出寫(xiě)入文件。如果將不存在的文件作為寫(xiě)入目標(biāo),則在寫(xiě)入之前創(chuàng)建文件。
覆蓋命令(Overwrite) > < 2>
-
>標(biāo)準(zhǔn)輸出 -
<標(biāo)準(zhǔn)輸入 -
2>標(biāo)準(zhǔn)錯(cuò)誤
附加命令(Append) >> << 2>>
-
>>標(biāo)準(zhǔn)輸出 -
<<標(biāo)準(zhǔn)輸入 -
2>>標(biāo)準(zhǔn)錯(cuò)誤
案例:
cat > write_file.log
lance
linux
tutorials
ctrl+d
查看當(dāng)前操作目錄下write_file.log文件,你會(huì)看到通過(guò)cat命令對(duì)應(yīng)的輸入。
可以通過(guò)>來(lái)覆蓋文件內(nèi)容,也可以使用>>命令來(lái)追加內(nèi)容。
管道命令(Pipes) |
管道命令將流從一個(gè)程序重定向到另一個(gè)程序。當(dāng)一個(gè)程序的標(biāo)準(zhǔn)輸出通過(guò)管道發(fā)送給另一個(gè)程序時(shí),第二個(gè)程序接收到的第一個(gè)程序輸出的數(shù)據(jù)將不會(huì)顯示在終端上,僅會(huì)顯示第二個(gè)程序的標(biāo)準(zhǔn)輸出。
ls | less
從ls輸出并傳輸?shù)?code>less程序。
>和>>與|命令類似,前者將輸入重定向文件,后者將輸入重定向到程序命令。
過(guò)濾命令(Filters)
Filters命令是Linux系統(tǒng)的標(biāo)準(zhǔn)命令,可以單獨(dú)使用。
Filters是更改管道重定向和輸出的命令。
-
find查找返回文件名與傳遞給查找的參數(shù)匹配的文件 -
grep返回與傳遞grep命令的字符串模式匹配的文本 -
tee將標(biāo)準(zhǔn)輸入重定向到標(biāo)準(zhǔn)輸出和一個(gè)或者多個(gè)文件 -
tr查找并替換另一個(gè)字符串 -
wc計(jì)算字符、行、單詞
小結(jié)
Linux系統(tǒng)內(nèi)置的命令程序非常豐富,提供了強(qiáng)大的工具集。作為專業(yè)技術(shù)從業(yè)者需要掌握其中很多基礎(chǔ)命令工具的使用方式,有助提高工作效率。
我們可以通過(guò)man命令來(lái)即時(shí)學(xué)習(xí)命令的使用文檔。
推薦一些工作常用的高效工具:
- tmux
- jq
- sed
- awk