使用文本模式,使用sed,awk或perl从大文件中提取记录

时间:2017-03-02 11:04:07

标签: perl awk sed

我有一个巨大的文件,每个记录用空行分隔。我只需要提取那些包含特定字符串的记录。如果我使用sed,awk,perl,你会怎么做?

输入示例:

firstrecord
data
moredata

secondrecord
data
moredata2

...

我需要提取包含moredata2的所有记录,因此输出将是

secondrecord
data
moredata2

我试过的perl代码,但是将每条记录提取到一个新文件,

我如何一次提取所有记录,以及如何从文件中读取模式?

perl -00ne 's#PAT.*/(.*)\n##; open($F,">","$1.txt"); s/\n\s*(\n|$)//g; 
        print $F "$_\n"' original.txt 

4 个答案:

答案 0 :(得分:2)

我的答案是 - 使用perl,设置$/和正则表达式匹配您想要的记录。

$/是记录分隔符。将其设置为空字符串将设置为'段落'模式,因此迭代寻找空行。这正是你需要的。

m/moredata2/隐式匹配当前块。

#!/usr/bin/env perl

use strict;
use warnings;

local $/ = '';

while ( <DATA> ) { 
    if ( m/moredata2/ ) { 
        print "Matched:\n";
        print;
    }
}

__DATA__
firstrecord
data
moredata

secondrecord
data
moredata2

答案 1 :(得分:0)

请检查此代码可能对您有所帮助。你可以尝试尽可能简化。

use strict;
use warnings;

my $joinline = do { local $/; <DATA> }; 
while($joinline=~m/\n{2}((?:(?!moredata2).)*)moredata2\n/gs)
{
    print "Matched: $&\n";
}


__DATA__
firstrecord
data
moredata

secondrecord
data
moredata2

thirdrecord
data
moredata

fourthrecord
data
moredata2

感谢。

答案 2 :(得分:0)

awk

awk '/moredata2/' RS="" yourfile

<强>解释

  

另一种技术是将空行分开记录。通过   特殊分配,RS表示的空字符串   记录由一个或多个空行分隔。 设置RS时   对于空字符串,每个记录总是在第一个空白行结束   遇到。下一条记录直到第一个非空白才开始   后面的行。无论连续出现多少空白行,   它们都充当一个记录分隔符。 (空行必须完整   空;仅包含空格的行不计算在内。)

检查docs

答案 3 :(得分:-1)

在这种情况下,

awk会产生魔力

awk -v RS= '/moredata2/{print (f?"\n":"")$0; f=1}' original.txt

你明白了,

secondrecord
data
moredata2

...