如何在非常大的SINGLE行文件中查找模式和周围内容?

时间:2011-10-03 18:38:50

标签: 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 size of -A 3

我希望它返回:

567890abcdef

任何提示都会很棒。 非常感谢。

3 个答案:

答案 0 :(得分:11)

您可以尝试使用-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

答案 1 :(得分:4)

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

sed -n '
  s/.*\(...890abc...\).*/\1/p
  ' infile

答案 2 :(得分:3)

我能想到这样做的最好方法是使用一个很小的Perl脚本。

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

while(<>) {
  print $& if( /.{$before}$pattern.{$after}/ );
}

然后你会这样执行它:

cat very_large_file | ./myPerlScript.pl 890abc 3 3

编辑: Dang,Paolo的解决方案要容易得多。哦,好吧,viva la Perl!