簡體   English   中英

PHP或Linux Shell:減少具有10行以上的文本文件的最快方法,只有最后10行

[英]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 >filetail程序實際上是生成輸出的,因此在執行命令之前不會發生輸出 - 但是文件已經被打開以便在此之前寫入(由於重定向),並打開該文件寫作截斷它。)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM