我問了一個question關於彈出PHP中文本文件的最後一行,現在是否可以重新編寫shell腳本中的邏輯?shell:刪除一個巨大的文本日誌文件的最後一行
我嘗試這樣做,以獲得最後一行:
tail -n 1 my_log_file.log
,但我不知道我怎麼能去掉最後一行,並保存文件。
P.S.因爲我使用Ubuntu服務器。
我問了一個question關於彈出PHP中文本文件的最後一行,現在是否可以重新編寫shell腳本中的邏輯?shell:刪除一個巨大的文本日誌文件的最後一行
我嘗試這樣做,以獲得最後一行:
tail -n 1 my_log_file.log
,但我不知道我怎麼能去掉最後一行,並保存文件。
P.S.因爲我使用Ubuntu服務器。
(解決方案基於sch's answer所以信貸應該去給他/她)
這種方法可以讓你有效地檢索文件的最後一行,並截斷該文件刪除了這一行。由於文件不是按順序讀取,因此可以更好地處理大量輸入。
# retrieve last line from file
LAST=$(tail -n 1 my_log_file.log)
# truncate file
let TRUNCATE_SIZE="${#LAST} + 1"
truncate -s -"$TRUNCATE_SIZE" my_log_file.log
# ... $LAST contains 'popped' last line
注意,如果該文件的調用之間修改爲tail
和truncate
預期這將無法工作。
你想要的是在最後一行之前截斷文件,而不必完全讀取文件。
truncate -s -"$(tail -n1 file | wc -c)" file
這是假設文件當前未被寫入。
truncate是GNU coreutils的一部分(通常在最新的Linux發行版中可以找到),而不是標準化的Unix或POSIX命令。許多「dd」實現也可用於截斷文件。
使用'tail' +'truncate'確實是一個更有效的解決方案。當然,爲了允許OP檢索最後一行'tail -n'的內容,應單獨調用並存儲在var中。然後可以使用'$ {#VAR} + 1'作爲截斷大小。 –
添加了一個[維基解答](http://stackoverflow.com/questions/12176492/shell-delete-the-last-line-of-a-huge-text-log-file/12176634#12176634)與建議的更改。 –
似乎有一個額外的 - 尾巴/ WC組合。另外,你可以在這裏使用'-r'選項(使用給定文件的大小):'truncate -r <(tail -n1文件)文件'如果你不介意bashism。 – chepner
請注意,與我在GNU系統上使用的基於「wc」的解決方案相反,如果最後一行包含NUL字符,則上述內容僅適用於zsh。另外,如果最後一行不是NL終止,它將無法正常工作。 –
此外,'truncate'預計_bytes_的大小,而'$ {#LAST}'以字符數計算'$ LAST'的長度。您希望將語言環境設置爲C以使其相當。否則,如果最後一行包含多字節字符,則無法正常工作。 –