【问题标题】:Return ranges of lines from text file PHP or LINUX从文本文件 PHP 或 LINUX 返回行的范围
【发布时间】:2012-09-21 22:17:28
【问题描述】:

我有一个小问题,我需要能够读取大小未知的文件,它可能是几百行或更多,日志文件一直在变化,具体取决于我检查的时间。我想要一个在 php 或 linux 中的方法,我可以从文件中读取一系列行。我不想将整个文件读入 php 内存然后删除这些行,因为文件可能比 php 允许的内存大。

我还希望它使用默认的 php 模块或默认的 linux 工具,因为它需要可移植,所以不需要安装任何东西。

编辑:

对于基于 linux 的选项,我希望能够提供多个范围,我可能需要获得几个不同范围的行我已经读过了?

【问题讨论】:

    标签: php linux file


    【解决方案1】:
    $ cat input.txt
    q
    w
    e
    r
    t
    y
    u
    i
    $ sed -n 2,5p input.txt
    w
    e
    r
    t
    

    【讨论】:

      【解决方案2】:

      使用 awk:

      awk 'NR>=10 && NR<=15' FILE
      

      使用 awk(两个范围):

      awk 'NR>=10 && NR<=15 || NR>=26 && NR<=28' FILE
      

      ed:

      echo 2,5p | ed -s FILE
      

      ed 和两个范围:

      echo -e "2,5p\n7,8p" | ed -s FILE
      

      最后但同样重要的是,sed 具有两个范围的解决方案(最快的解决方案,使用 time 测试):

      sed -n '2,5p;7,8p' FILE
      

      【讨论】:

      • 编辑添加 PHP 解决方案。
      • 您的 PHP 解决方案将整个文件读入内存。这是问题中要避免的具体问题。
      • 您能解释一下 ed 如何提供帮助吗?我是一些 linux 伤害者的新手
      • 这是另一个显示范围的工具。来自维基百科:ed 继续影响 ex,这反过来又产生了 vi。非交互式 Unix 命令 grep 的灵感来自 qed 和后来的 ed 的常见特殊用途,其中命令 g/re/p 表示全局搜索正则表达式 re 并打印包含它的行。 Unix 流编辑器 sed 实现了 qed 的许多脚本功能,这些功能在 Unix 上不受 ed 支持; sed 反过来影响了编程语言 AWK 的设计,这反过来又启发了 Perl 的各个方面。 en.wikipedia.org/wiki/Ed_%28text_editor%29
      • 仍然很难理解如何提供超过一个范围的数字而不必查找我已经阅读过的行?
      【解决方案3】:

      类似的东西呢

      head -100 | tail -15
      

      给你第 86-100 行

      【讨论】:

        【解决方案4】:
        while ($lines_read < last_line_desired) {
          while ($line = fgets($filehandle, $buffersize) !== false)
            if (line >= first_desired_line) {
              push($interesting_lines, $line)
            }
          }
          $lines_read++
        }
        

        打开文件句柄,选择足够大的缓冲区大小以覆盖任何预期的行长度等由您决定。

        如果您正在阅读经常附加到的文件,您应该查看 ftellfseek 函数以记录您在数据中的位置,并在阅读更多内容之前跳过所有旧内容。

        【讨论】:

        • 看起来不错,但你能看到我发布的更新可能不适用于你,但也许你可以举个例子。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 2015-05-24
        • 1970-01-01
        相关资源
        最近更新 更多