awk在匹配之前打印匹配的行和行

时间:2011-02-03 20:31:55

标签: regex awk

以下是我尝试使用awk做的事情。在匹配和打印之前获取与正则表达式匹配的行和行。我可以获得与正则表达式相匹配的行,但不是之前的行:

awk '{if ($0!~/^CGCGGCTGCTGG/) print $0}' 

6 个答案:

答案 0 :(得分:11)

在这种情况下,您可以使用grep轻松解决它:

grep -B1 foo file

但是,如果你需要使用awk:

awk '/foo/{if (a && a !~ /foo/) print a; print} {a=$0}' file

答案 1 :(得分:2)

/abc/{if(a!="")print a;print;a="";next}
{a=$0}

答案 2 :(得分:1)

我创建了以下awk脚本。打印匹配行以及前两行。你可以通过这个想法使它更灵活。

<强> search.awk

{
    a[0]=$0;
    for(i=0;i<2;i++)
    {
       getline;
       if(i==0){
            a[1]=$0;
       }
       if(i==1){
            if($0 ~ /message received/){
                print a[0];     
                print a[1];
                print $0;
            }
       }
    }
}

用法:

awk '{print $0}' LogFile.log | awk -f search.awk

答案 3 :(得分:0)

为什么不使用grep -EB1 '^CGCGGCTGCTGG'

执行同样事情的awk非常啰嗦,请参阅Marco的回答。

答案 4 :(得分:0)

使用更直接的模式搜索

gawk '{if (/^abc$/) {print x; print $0};x=$0}' file1 > file2

答案 5 :(得分:0)

也许稍微偏离主题,但我使用belisarius的答案来创建我自己的上述解决方案的变体,搜索第N 条目,并返回该行和前一行。

awk -v count=1 '/abc/{{i++};if(i==count){print a;print;exit}};{a=$0}' file