Command-Line

如何在日誌文件中保留最後 50 行

  • August 4, 2016

我嘗試在文件中保留最後 50 行,每分鐘保存一次溫度。我使用了這個命令:

tail -n 50 /home/pi/Documents/test > /home/pi/Documents/test

但結果是空的測試文件。我想,它會列出最後 50 行測試文件並將其插入到測試文件中。當我使用這個命令時:

tail -n 50 /home/pi/Documents/test > /home/pi/Documents/test2

它工作正常。test2 文件中有 50 行。

誰能解釋一下問題出在哪裡?

問題是您的 shell 在執行命令之前設置了命令管道。這不是“輸入和輸出”的問題,而是文件的內容在 tail 執行之前就已經消失了。它類似於:

  1. shell打開>輸出文件進行寫入,截斷它
  2. 外殼設置為使文件描述符 1(用於標準輸出)用於該輸出
  3. 外殼執行tail.
  4. tail執行,打開/home/pi/Documents/test並在那裡找不到任何東西

有多種解決方案,但關鍵是要了解問題、實際出了什麼問題以及為什麼。

這將產生你正在尋找的東西,

echo "$(tail -n 50 /home/pi/Documents/test)" > /home/pi/Documents/test

解釋 :

  • $()被稱為執行的命令替換tail -n 50 /home/pi/Documents/test
  • 引號保留輸出中的換行符。
  • > /home/pi/Documents/test將輸出重定向echo "$(tail -n 50 /home/pi/Documents/test)"到同一個文件。

引用自:https://unix.stackexchange.com/questions/299106