如何在grep中grep

Dav*_*542 6 unix linux grep

我有一堆大量的文本文件,每个大约100MB.

我想grep找到包含'INDIANA JONES'的条目:

$ grep -ir 'INDIANA JONES' ./
Run Code Online (Sandbox Code Playgroud)

然后,我想找到条目中有PORTUGAL5,000个字符的INDIANA JONES单词.我该怎么做?

# in pseudocode
grep -ir 'INDIANA JONES' ./ | grep 'PORTUGAL' within 5000 char
Run Code Online (Sandbox Code Playgroud)

Pla*_*rob 1

考虑安装 ack-grep。

sudo apt-get install ack-grep
Run Code Online (Sandbox Code Playgroud)

ack-grep 是 grep 的更强大版本。

除了完整的批处理脚本之外,对于您的问题(我能想到的)没有简单的解决方案,但是您可以在 ack-grep 上使用 -A 和 -B 标志来指定要输出的尾随或前导行的数量。

这可能不是几个字符,但朝这个方向又迈进了一步。

虽然这可能不是一个解决方案,但它可能会给您一些如何做到这一点的想法。查找过滤器,如 ack、awk、sed 等,看看是否可以找到带有此类行为标志的过滤器。

ack-grep 手册:

http://manpages.ubuntu.com/manpages/hardy/man1/ack-grep.1p.html

编辑:

我认为悲伤的消息是,您可能认为您正在寻找的是这样的:

grep "\(INDIANA JONES\).\{1,5000\}PORTUGAL" filename
Run Code Online (Sandbox Code Playgroud)

问题是,即使是在一个小文件上,查询这个文件在时间上也是不可能的。我让这个与另一个号码一起工作。这是一个尺寸问题。

对于如此大的一组文件,您需要通过多个步骤来完成此操作。

一个办法:

我知道的唯一解决方案是 ack-grep 的前导和尾随输出。

第一步:你的队伍有多长?

如果您知道必须输出多少行(并且可以通过几种方式估计/计算),那么您将能够 grep 第一个 grep 的输出。根据文件中的内容,您应该能够获得一个合适的上限,即 5000 个字符的行数(如果一行平均有 100 个字符,则 50 行以上应该可以覆盖您,但如果它有 10 个字符,您就可以了)需要 500+)。

您必须确定可能为 5000 个字符的最大行数。如果您愿意,您可以猜测或选择一个较高的范围,但这取决于您。这是你的数据。

这样,调用:(如果您需要 100 行 5000 个字符)

ack-grep -ira "PORTUGAL" -A 100 -B 100 filename
Run Code Online (Sandbox Code Playgroud)

ack-grep -ira "INDIANA JONES" -A 100 -B 100 filename
Run Code Online (Sandbox Code Playgroud)

将 100 替换为您需要的内容。

第 2 步:解析输出

您需要获取 ack-grep 返回的匹配项并解析它们,在这些子范围内再次查找任何匹配项。

在第一个 PORTUGAL ack-grep 匹配输出中查找 INDIANA JONES,并在第二组匹配中查找 PORTUGAL。

这应该需要更多的工作,可能涉及 bash 脚本(我可能会看看本周能否让一个脚本工作),但它通过将其分解为更易于管理的块来解决您的海量数据问题。