Parsing 如何在一个非常大的单行文件中找到模式和周围的内容?

Parsing 如何在一个非常大的单行文件中找到模式和周围的内容?,parsing,bash,Parsing,Bash,我有一个非常大的100Mb+文件,其中所有内容都在一行上。 我希望在该文件中找到一个模式以及该模式周围的一些字符 例如,我想调用下面的命令,但其中-a和-B是字节数,而不是行数: cat very_large_file | grep -A 100 -B 100 somepattern 因此,对于包含以下内容的文件: 1234567890abcdefghijklmnopqrstuvwxyz 有一种 890abc and a before size of -B 3 and an after s

我有一个非常大的100Mb+文件,其中所有内容都在一行上。 我希望在该文件中找到一个模式以及该模式周围的一些字符

例如,我想调用下面的命令,但其中-a和-B是字节数,而不是行数:

cat very_large_file | grep -A 100 -B 100 somepattern
因此,对于包含以下内容的文件:

1234567890abcdefghijklmnopqrstuvwxyz
有一种

890abc
and a before size of -B 3 
and an after size of -A 3
我希望它能返回:

567890abcdef
任何提示都很好。
非常感谢。

您可以尝试-o选项:

-o, --only-matching
      Show only the part of a matching line that matches PATTERN.
并使用正则表达式匹配模式和前面/后面的3个字符,即

grep -o -P ".{3}pattern.{3}" very_large_file 
在你给出的例子中,应该是

echo "1234567890abcdefghijklmnopqrstuvwxyz" > tmp.txt
grep -o -P ".{3}890abc.{3}" tmp.txt

我能想到的最好的方法是使用一个小小的Perl脚本

#!/usr/bin/perl
$pattern = $ARGV[0];
$before = $ARGV[1];
$after = $ARGV[2];

while(<>) {
  print $& if( /.{$before}$pattern.{$after}/ );
}
编辑:Dang,保罗的解决方案要简单得多。哦,好吧,万岁

另一个带有sed的(在GNU grep不可用的系统上可能需要它):


抱歉,正则表达式的正确选项是-P,而不是-eWell,当我们想到正则表达式时,Perl是一种本地语言。。。猜猜我的grep行中的-P代表什么:)?
cat very_large_file | ./myPerlScript.pl 890abc 3 3
sed -n '
  s/.*\(...890abc...\).*/\1/p
  ' infile