2012-08-29 49 views

回答

9

(解決方案基於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 

注意,如果該文件的調用之間修改爲tailtruncate預期這將無法工作。

+1

請注意,與我在GNU系統上使用的基於「wc」的解決方案相反,如果最後一行包含NUL字符,則上述內容僅適用於zsh。另外,如果最後一行不是NL終止,它將無法正常工作。 –

+0

此外,'truncate'預計_bytes_的大小,而'$ {#LAST}'以字符數計算'$ LAST'的長度。您希望將語言環境設置爲C以使其相當。否則,如果最後一行包含多字節字符,則無法正常工作。 –

4

一種方法是:

sed '$d' <f1> f2 ; mv f2 f1 
+0

我不明白這一點。什麼是'f2'和'f1'? – Raptor

+0

我遲到了,但這是我最喜歡的解決方案。您可以使用sed的「-i」標誌進行就地更改:「sed -i -e'$ d'my_log_file.log」 –

+0

如果您編寫跨平臺腳本,請小心使用'-i'在macOS和Linux上不同。 – bfontaine

27

爲了讓沒有最後行的文件內容,你可以使用

head -n-1 logfile.log 

(我不知道這是無處不在的支持)

sed '$d' logfile.log 
+0

Perfecto !!!!不錯的一個 – Satish

+1

該sed一個完美的作品! $ d是在最後一行之前退出的命令,這就是爲什麼它可以跳過最後一行!請參閱https://www.gnu.org/software/sed/manual/sed.html。 – nothize

15

你想要的是在最後一行之前截斷文件,而不必完全讀取文件。

truncate -s -"$(tail -n1 file | wc -c)" file 

這是假設文件當前未被寫入。

truncate是GNU coreutils的一部分(通常在最新的Linux發行版中可以找到),而不是標準化的Unix或POSIX命令。許多「dd」實現也可用於截斷文件。

+0

使用'tail' +'truncate'確實是一個更有效的解決方案。當然,爲了允許OP檢索最後一行'tail -n'的內容,應單獨調用並存儲在var中。然後可以使用'$ {#VAR} + 1'作爲截斷大小。 –

+0

添加了一個[維基解答](http://stackoverflow.com/questions/12176492/shell-delete-the-last-line-of-a-huge-text-log-file/12176634#12176634)與建議的更改。 –

+3

似乎有一個額外的 - 尾巴/ WC組合。另外,你可以在這裏使用'-r'選項(使用給定文件的大小):'truncate -r <(tail -n1文件)文件'如果你不介意bashism。 – chepner

相關問題