我有一个非常大的文件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
任何提示都会很棒。 非常感谢。
答案 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!