【问题标题】:How to crop(cut) text files based on starting and ending line-numbers in cygwin?如何根据 cygwin 中的开始和结束行号裁剪(剪切)文本文件?
【发布时间】:2011-08-06 16:53:00
【问题描述】:

我有几个大约 100MB 的日志文件。 我个人觉得处理这么大的文件很麻烦。我知道我感兴趣的日志行只有 200 到 400 行左右。

什么是从这些文件中提取相关日志行的好方法,即我只想将行号范围通过管道传输到另一个文件。

例如,输入是:

filename: MyHugeLogFile.log
Starting line number: 38438
Ending line number:   39276

是否有一个命令可以在 cygwin 中运行到 cat 仅在该文件中的那个范围内?我知道,如果我能以某种方式在标准输出中显示该范围,那么我也可以通过管道传输到输出文件。

注意:添加 Linux 标记以获得更多可见性,但我需要一个可能在 cygwin 中工作的解决方案。 (通常 linux 命令在 cygwin 中可以工作)。

【问题讨论】:

  • 100Mb 日志文件并不大 ;-)
  • 当然,但如果你必须在notepad++之类的编辑器中研究其中的一部分,那么它们看起来相当庞大:)

标签: linux command-line cygwin


【解决方案1】:

听起来像是sed 的工作:

sed -n '8,12p' yourfile

...将yourfile 的第 8 行到第 12 行发送到标准输出。

如果你想在前面加上行号,你可能希望先使用cat -n

cat -n yourfile | sed -n '8,12p'

【讨论】:

  • @bits:乐于助人。我在您输入答案时附加了cat 部分。也许这也会有用。
  • 我觉得第一个不涉及cat的方案最适合我。简洁明了。
【解决方案2】:

您可以使用wc -l 计算总行数。

然后,您可以组合 headtail 以获得所需的范围。假设日志是 40,000 行,你想要最后 1562 行,然后你想要前 838 行。所以:

tail -1562 MyHugeLogFile.log | head -838 | ....

或者使用sedawk 可能有更简单的方法。

【讨论】:

    【解决方案3】:

    当我尝试将文件拆分为 100 000 行的文件时,我看到了这个线程。比 sed 更好的解决方案是:

    split -l 100000 database.sql database-
    

    它会给出如下文件:

    database-aaa
    database-aab
    database-aac
    ...
    

    【讨论】:

      【解决方案4】:

      如果你只是想剪切文件的一部分——比如从第 26 行到第 142 行——并将其输入到一个新文件中: cat file-to-cut.txt | sed -n '26,142p' >> new-file.txt

      【讨论】:

      • 您所说的与接受的答案相同:stackoverflow.com/a/5683408
      • 执行此操作后,我不确定“剪切”是否是正确的词,因为在我的 GNU/Linux 系统上,该命令执行“复制”,而不是通常将其归因于剪切。
      【解决方案5】:

      这个怎么样:

      $ seq 1 100000 | tail -n +10000 | head -n 10
      10000
      10001
      10002
      10003
      10004
      10005
      10006
      10007
      10008
      10009
      

      它使用tail 从第 10,000 行及以后输出,然后使用head 仅保留 10 行。

      sed 的结果相同(几乎):

      $ seq 1 100000 | sed -n '10000,10010p'
      10000
      10001
      10002
      10003
      10004
      10005
      10006
      10007
      10008
      10009
      10010
      

      这个的好处是可以直接输入行范围。

      【讨论】:

      • 这是一个可能的解决方案,但这需要我计算39276-38438=838。因为我将不得不使用838 作为头部的输入。我正在寻找一种解决方案,其中输入参数严格地是开始和结束行号,即3843839276
      【解决方案6】:

      如果您只对最后 X 行感兴趣,您可以像这样使用“tail”命令。

      $ tail -n XXXXX yourlogfile.log >> mycroppedfile.txt
      

      这会将日志文件的最后 XXXXX 行保存到名为“mycroppedfile.txt”的新文件中

      【讨论】:

        【解决方案7】:

        这是一个旧线程,但我很惊讶没有人提到 grep。 -A 选项允许在搜索匹配之后指定要打印的行数,而 -B 选项包括匹配之前的行。以下命令将在文件“mylogfile.log”中输出“我的搜索字符串”之前的 10 行和之后的 10 行:

        grep -A 10 -B 10 "我的搜索字符串" mylogfile.log

        如果一个大文件中有多个匹配项,则输出会很快变得笨拙。两个有用的选项是 -n 告诉 grep 包含行号和 --color 突出显示输出中的匹配文本。

        如果要搜索多个文件,则 grep 允许列出多个文件,并用空格分隔。也可以使用通配符。把它们放在一起:

        grep -A 10 -B 10 -n --color "我的搜索字符串" *.log someOtherFile.txt

        【讨论】:

          猜你喜欢
          • 2013-08-28
          • 1970-01-01
          • 2013-04-13
          • 1970-01-01
          • 1970-01-01
          • 2018-09-29
          • 1970-01-01
          • 2018-02-16
          • 2011-07-19
          相关资源
          最近更新 更多