【发布时间】:2013-05-17 15:56:40
【问题描述】:
我需要能够搜索字符串(让我们使用 4320101),在字符串上方打印 20 行并在此之后打印,直到找到字符串
例如:
Random text I do not want or blank line
16 Apr 2013 00:14:15
id="4320101"
</eventUpdate>
Random text I do not want or blank line
我只想将以下结果输出到文件中:
16 Apr 2013 00:14:15
id="4320101"
</eventUpdate>
在我想要的文件中有多个这些文本组的示例。
我尝试在下面使用这个:
cat filename | grep "</eventUpdate>" -A 20 4320101 -B 100 > greptest.txt
但它只显示字符串两侧的 20 行。
注意事项:
- 文本所在的行号不一致,所以我不能关闭这些,因此我使用 -A 20。
- 理想情况下,我宁愿拥有它,这样当它搜索字符串时,它会在找到时停止然后继续搜索。
总结:找到4320101,输出4320101以上的20行(或一行空白),然后输出4320101以下的所有行直到
</eventUpdate>
做研究我不确定如何让 awk、nawk 或 sed 为我工作。
【问题讨论】:
-
-A是 grep 将在匹配行之后打印A的行数。如果您不想要匹配行之后的任何行,为什么要要求 20 行?另外我不明白你关于行号不一致的评论,但如果你想要 20 行Before,请使用-B 20 -
我明白了。这应该有效: cat 文件名 | grep 4320101 -A 100 -B 20 ,但它返回: : No such file or directory
-
我意识到 -A 和 -B 的工作方式是它需要值文件名,因此它认为 eventUpdate 是一个文件。但是我只想搜索到 eventUpdate(给它 100 行以在 4320101 以下找到它)
-
没有标准的工具来完成这项工作。我有一个 70 行(非最小)的 Perl 脚本,它在前后各行;它必须修改为处理“直到替代模式之后”,但这比“从 4320101 之前的指定模式”要容易得多。我还有一个在每个文件上使用
ed(以及sed和sort和sed)的shell 脚本版本——这将是最容易适应的。如果您需要这些,请与我联系(请参阅我的个人资料);它们不是您问题的完全有效的解决方案,但可能是提供问题的有用垫脚石。 -
如果 2 个范围重叠,您希望发生什么,例如如果 2 次出现 4320101 位于彼此相距 20 行之内?打印所有行一次?将两个范围内的行打印两次?