【发布时间】:2013-05-16 15:25:55
【问题描述】:
我如何grep 大文件的某个部分从第 1000 行到第 2000 行,直到第 1000 行或从第 1000 行开始?
我不想将文件拆分成更小的文件。
【问题讨论】:
-
你的 grep 模式是什么?是否有 perl 特定的正则表达式,例如向后看/向前看?如果只是简单的正则表达式模式,我建议你使用 sed/awk
标签: unix command-line grep
我如何grep 大文件的某个部分从第 1000 行到第 2000 行,直到第 1000 行或从第 1000 行开始?
我不想将文件拆分成更小的文件。
【问题讨论】:
标签: unix command-line grep
您可以使用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
grep 'abc',awk 单线是可以的,你的 sed 线也可以在没有管道到 grep 的情况下完成这项工作。但是,如果 grep 行看起来像 grep -P -A3 -B2 '(?<!pre)abc(?![^-./]after)',那么 awk 单行将有所不同。
作为@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
【讨论】:
我建议
head -2000 FILE.TXT | tail -1000 | grep XXX
作为最简洁的解决方案,因为head 不必读取大文件,只需读取前 N 千行。它基本上实现了q 在sed 解决方案中所做的事情。
【讨论】:
sed 解决方案q。