【问题标题】:Grep part of large file without spliting itgrep 大文件的一部分而不拆分它
【发布时间】:2013-05-16 15:25:55
【问题描述】:

我如何grep 大文件的某个部分从第 1000 行到第 2000 行,直到第 1000 行或从第 1000 行开始? 我不想将文件拆分成更小的文件。

【问题讨论】:

  • 你的 grep 模式是什么?是否有 perl 特定的正则表达式,例如向后看/向前看?如果只是简单的正则表达式模式,我建议你使用 sed/awk

标签: unix command-line grep


【解决方案1】:

您可以使用sed 进行预处理。编辑:根据肯特的建议添加q

sed -n '1000,2000{p;2000q}' file.txt | grep 'abc'

从第 1000 行到文件末尾

sed -n '1000,$p' file.txt | grep 'abc'

【讨论】:

  • 如果文件很大,在合适的地方添加q也不错。
  • 或者只是awk 'NR==2000{exit(0)}NR>=1000 && /pattern/' file.txt
  • @tripleee,好主意。请将其添加为我可以 +1 的答案
  • 我们不知道 OP 的 grep 行是什么样子的。这就是为什么我在问题下发表评论的原因。对于grep 'abc',awk 单线是可以的,你的 sed 线也可以在没有管道到 grep 的情况下完成这项工作。但是,如果 grep 行看起来像 grep -P -A3 -B2 '(?<!pre)abc(?![^-./]after)',那么 awk 单行将有所不同。
【解决方案2】:

作为@ravoori 对sed 解决方案的一个小改进,将grep 重构为sed

sed '1000,$/pattern/!d;2000q' file.txt

如果变量中有模式,请使用双引号;

sed '1000,$/'"$pattern"'/!d;2000q' file.txt

或者在 awk 中等效:

awk 'NR==2000{exit(0)}NR>=1000 && /pattern/' file.txt

或带变量

awk -v pat="$pattern" 'NR==2000{exit(0)}NR>=1000 && $0~pat' file.txt

【讨论】:

    【解决方案3】:

    我建议

    head -2000 FILE.TXT | tail -1000 | grep XXX

    作为最简洁的解决方案,因为head 不必读取大文件,只需读取前 N 千行。它基本上实现了qsed 解决方案中所做的事情。

    【讨论】:

    • 使用三个进程而不是一个进程的好处是......?
    • 你能测量一个文件上 1 个进程与 3 个进程之间的差异吗?我看到的好处是,它清楚地表明我将丢弃 2000 行之后的任何内容以及 1000 行之前的任何内容。正如 OP 所表达的那样,它更接近于规范。但后来我确实喜欢sed 解决方案q
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多