PHP或Linux壳牌:减少有超过10行的文本文件,最快的方式只有最后10行(PHP or Linu

2019-09-20 05:09发布

我需要知道最快的方式可能,PHP或Linux的命令行界面,以减少已超过10行只有最后10行的文本文件。 我想用10行的这个例子。

谢谢 :)

Answer 1:

以减少文件,它是最后再行做

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重命名文件(或移动到不同的位置)。



Answer 2:

如果你真的真的不想生成一个新的文件,那么你可以尝试

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读取的重定向以写入模式打开之前tail设法查看所有数据。

即使行为显然是定义和可预测的,这仍然感觉有点哈克给我。 它依赖于bash的奥秘,并很可能导致内存问题,如果你试图获得过多或过排长队。 (我用〜500条字符线测试,并没有发现任何问题,但还没有超过10行中进行过测试。)这很可能是更好的使用临时文件,除非您需要保留相同的inode编号一些奇怪的原因。



Answer 3:

tail -n 10 yourfile > yourfile.tmp && mv yourfile.tmp yourfile

编辑专门给最后10行的文件可能低于10行更大。



Answer 4:

在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

注意与第一示例输出到不同的文件,而第二覆盖现有的文件。

您也可以通过使用EXEC()的shell命令里面,或者读取整个文件到一个数组与文件(),然后取数组的最后十个元素,加入他们更加费力的方式回到做到这一点在PHP用的fwrite()或类似的文件。



文章来源: 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