[英]PHP or Linux Shell: Fastest way to reduce a text file to only have the last 10 characters
[英]PHP or Linux Shell: Fastest way to reduce a text file that has more than 10 lines to only have the last 10 lines
我需要知道在PHP或Linux命令外殼中最快的方法,以減少超過10行的文本文件,只有最后10行。 我想在這個例子中使用10行。
謝謝 :)
將文件減少到最后一行然后行
tail -n 10 /path/to/file > /path/to/file.tmp && rm /path/to/file && mv /path/to/file.tmp /path/to/file
說明:
tail
輸出文件的最后n
行。 >
將其寫入文件。 &&
用於鏈接命令。 rm
刪除文件。 mv
重命名文件(或移動到其他位置)。
如果你真的不想生成新文件,那么你可以試試
echo "$(tail -n 10 path/to/file)" >path/to/file
$()
就像反引號一樣(它評估內部的任何內容並等同於所述命令的輸出),除了它在字符串中效果更好。 在我的Linux機器上,在輸出到文件之前對字符串進行評估(意味着tail
運行)(導致tail file >file
的問題;文件被打開 - 並被截斷 - 一旦命令開始)。 我在想它是因為 echo
是內置的,但不要引用我的話。
編輯:實際上,我仔細看了一下。 這是因為tail
是一個字符串。 有幾個階段 - 這里,我們關心的是插值,重定向和執行 - 總是以某個定義的順序發生(即剛剛給出的順序)。 在插入字符串的過程中,Bash必須在其中運行命令。 在進行任何重定向之前。 使用直tail file >file
, tail
程序實際上是生成輸出的,因此在執行命令之前不會發生輸出 - 但是文件已經被打開以便在此之前寫入(由於重定向),並打開該文件寫作截斷它。)
phase tail file >file echo "$(tail file)" >file
-------------+---------------------------------+-------------------------------
interpolate nothing run "tail file"; get output (+)
redirect open file for write; set stdout open file for write; set stdout
execute run "tail file" (*) run 'echo "line\nline\n..."'
(*)
:注意,由於此時file
已經打開進行寫入,現在它已被截斷。 所以tail
讀取0個字節。
(+)
:由於在重定向打開file
之前讀入了file
,因此tail
設法查看所有數據。
雖然行為明顯是定義和可預測的,但這對我來說仍然有些惹人討厭。 它依賴於bash arcana,如果你試圖獲得太多或太長的行,可能會導致內存問題。 (我測試了~500個char行,並沒有看到任何問題。但還沒有測試超過10行。)除非你需要保留相同的inode數量,否則最好使用臨時文件出於某種奇怪的原因。
tail -n 10 yourfile > yourfile.tmp && mv yourfile.tmp yourfile
編輯為僅提供可能大於10行的文件的最后10行。
在linux中你可以做到
tail -n 10 path/to/file > path/to/output/file
這將占用文件的最后十行(由-n之后的值指定的行數),然后將它們附加到另一個文件。
如果要僅使用最后十行覆蓋現有文件,請執行此操作
tail -n 10 path/to/file > path/to/output/file && mv path/to/output/file path/to/file
請注意,第一個示例輸出到另一個文件,而第二個示例覆蓋現有文件。
您也可以在PHP中使用帶有shell命令的exec(),或者使用file()將整個文件讀入數組,然后獲取數組的最后十個元素並將它們添加回來的更費力的方法fwrite()或類似的文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.