Parsing 如何在一个非常大的单行文件中找到模式和周围的内容?
我有一个非常大的100Mb+文件,其中所有内容都在一行上。 我希望在该文件中找到一个模式以及该模式周围的一些字符 例如,我想调用下面的命令,但其中-a和-B是字节数,而不是行数: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
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