Linux 文本處理(2) (寫入資料到文件)(重定向指令 >、>>、| 管道、標準數據流 stdin、stdout、stderr)

前言

本文將會介紹linux中的標準數據流,以及常見將數據寫入文件的方法

寫入資料到文件

通常有幾種方法

  • 使用 vi 編輯器
  • 重定向符( >、>> )
  • echo 指令 搭配 >、>> 重定向符
  • tee指令

echo (直接打印文字到終端上)

直接打印文字到終端上

1
echo "hello world"

終端機上就會打印出hello world

但有時想要將打印的文字寫入到文件,而非只是打印出來,可以配合 >>> 符號

1
echo "hello world" > test

此命令會將hello world寫入到 test 文件中

重定向符 >>> 兩者的差異

> 符號:覆蓋檔案內容

> 符號會將文字寫入指定的文件中,

  • 如果文件存在,會覆寫內容
  • 如果文件不存在,會創建新文件,並寫入內容
1
echo "hello world" > test

此時打印test 文件內容應該會出現hello world

>> 符號:追加檔案內容

>> 符號會將文字寫入指定的文件中,但不是使用覆寫的方式,而是在原本的內容上追加內容到文件末尾

1
echo "hello world" >> test

如果原本的test 文件裡面已有內容,那會在文件末尾追加hello world,linux 文件末尾通常是換行符(\n),所以會在新的一行看到hello world

tee 指令 (將資料寫入文件外,同時也在終端打印)

  • 將內容打印到終端,並寫入文件
1
echo "hello world" | tee test

這個指令類似於,先打印,在使用 > 寫入文件

1
2
3
echo "hello world"

echo "hello world" > test
  • 將內容打印到終端,並追加寫入文件
1
echo "hello world" | tee -a test

加上 -a 參數

重定向符號

  • > 覆寫內容
  • >> 追加內容
  • 2> 錯誤輸出重定向
  • < 從文件讀取內容,而不是從終端輸入
  • | 通道符,可以將文本傳給下一個指令處理

>:輸出重定向,覆蓋檔案內容

使用 > 可將命令的輸出重定向到指定的文件,如果該文件已經存在,則內容會被覆蓋;文件不存在則會創建一個新檔案

>>:追加輸出重定向,追加檔案內容

>> 可將命令的輸出附加到指定的文件,如果該文件已經存在,則內容會被追加。

<:輸入重定向

從文件讀取內容,而不是從終端輸入

1
sort < tempfile  > test

如上方指令就是將 tempfile 的內容傳到sort 指令裡,之後再寫入到test文件

2>:錯誤輸出重定向

將錯誤的輸出寫入到指定的檔案

1
rm -f delfile  2> test

例如,如果在刪除delfile的過程中出現錯誤,就將錯誤的原因寫入test文件,
可以做到將一般的輸出與錯誤輸出分流的效果

|:管道

將前一個命令的輸出,傳給後面的命令處理

1
grep "status: 502" myfile | tail -n 30

myfile 中出現status: 502的行數,傳給後面的tail 指令處理

stdin、stdout、stderr

stdinstdoutstderr是linux命令啟動時,創建的 標準數據流 ,linux 在執行命令時,是像流式一樣處理數據,

命令就像外殼(shell)一樣,這個外殼有來源跟出口,也就是輸入輸出,當要執行指令時,需要將數據流輸入外殼,並告訴命令這些數據流輸出的流向,是要透過管道|傳給下一個命令處理? 還是重定向>>>傳遞到文件內。

在linux 當中,所有的檔案都被視為一個文件,每一個文件都會分配一個獨立的文件標示符

  • stdin:標準輸入,文件標示符為 0
  • stdout:標準輸出,文件標示符為 1
  • stderr:標準錯誤,文件標示符為 2

stdin

代表著標準輸入,以下是常見用途

  • 用戶輸入:在命令行中獲取用戶鍵盤的輸入

  • 文件輸入:讀取文件的內容,作為其他命令的輸入

stdout

代表著標準輸出,以下是常見用途

  • 終端輸出:程式運行的結果輸出到終端上

  • 重定向到文件:程式運行的結果使用>>>,將數據寫入到文件中

stderr

代表著標準錯誤,通常用於將程式執行過程中的 錯誤 、警告和異常訊息輸出到終端或檔案,以下是常見用途

  • 區分一般輸出與錯誤的輸出:將正常輸出和錯誤訊息區分開來,使得使用者能夠更容易地捕捉並處理這些不同類型的訊息。

  • 將錯誤輸出重定向到文件:使用2> 將程式運行時遇到的錯誤輸出,寫入到文件中

1
ll 2> test.txt

參考資料

什么是Linux上的stdin,stdout和stderr?


Linux 文本處理(2) (寫入資料到文件)(重定向指令 >、>>、| 管道、標準數據流 stdin、stdout、stderr)
https://austin72905.github.io/2023/08/26/linux-text-processing2/
作者
Austin Lin
發布於
2023年8月26日
許可協議