【发布时间】:2017-03-14 22:46:28
【问题描述】:
grep -A 10 -f smallfile bigfile
greps 从 smallfile 到 bigfile 的每一行以及接下来的 10 行
是否可以通过使用另一个标志而不是 -A 来继续搜索以下行,直到在大文件中出现一个字符(比如说@),我需要从小文件中执行数百行,我有没有信息我需要 grep 的 smallfile 行后面有多少行,每个行都会改变。仅说明其中一行的示例:
小文件:
@123
@555
大文件:
@123
abc
def
ghj
@789
sdf
tyu
rzx
@555
yui
wer
@435
teg
gdgd
所以我希望它给我这个
@123
abc
def
ghj
@555
yui
wer
如果您知道从另一个文件中的一个文件“grepping”行的另一种方法可以做到这一点,那也可以,我可能会尝试编写一个 python 脚本或更复杂的循环,但我相信应该有一个使用 -m 之类的标志使 grep 执行此操作的方法,但我无法使其按我想要的方式工作。
非常感谢!
【问题讨论】:
-
为什么不切换到更高级的工具,例如
awk和perl? -
csplit bigfile /^\@/ -
@DragonRider,在标准的 gnu grep 中似乎没有这样的选项:git.savannah.gnu.org/cgit/grep.git/tree/src/grep.c#n1301
prtext .. pending = out_quiet ? 0 : MAX (0, out_after); .. prpending,这里的 lim 只是指向缓冲区末尾的指针。单一模式的 AWK 解决方案:stackoverflow.com/questions/29180929 & perl multiline regexp in grep & sed too. -
@osgx 谢谢,你认为 -A 标志可能与 -m 一起使用,比如 grep -A 9999999 -m @ -f smallfile bigfile,我尝试了几种方法,但都没有成功
-
@jm666 谢谢,你知道如何将 csplit 通过管道传送到这个 grep 命令中吗?