Awk 如何找到具有相同图案的两条连续线

Awk 如何找到具有相同图案的两条连续线,awk,sed,grep,Awk,Sed,Grep,我的文本文件如下所示: bla : 1 - etc blb : a - etc blc : 2 - etc bld : 3 - etc ble : 1 - etc blf : 1 - etc blg : a - etc blh : 1 - etc bli : a - etc 我正在文件中搜索模式“:1-”。一些连续的线有相同的模式,我需要这两条线加上下一条线 ble : 1 - etc blf : 1 - etc blg : a - etc 是否可以使用grep、sed或任何其他工具提取此行

我的文本文件如下所示:

bla : 1 - etc
blb : a - etc
blc : 2 - etc
bld : 3 - etc
ble : 1 - etc
blf : 1 - etc
blg : a - etc
blh : 1 - etc
bli : a - etc
我正在文件中搜索模式
“:1-”
。一些连续的线有相同的模式,我需要这两条线加上下一条线

ble : 1 - etc
blf : 1 - etc
blg : a - etc
是否可以使用
grep
sed
或任何其他工具提取此行?
提前谢谢。

我会使用
awk
而不是
sed

awk -F: 'm~$2{print m;print;getline;print}{m=$0}' input.txt

m
是保存最后一行的变量。如果它与
后面的部分匹配:
我们打印
m
和当前行,然后获得下一行并打印它。最后,
m=$0
将当前行存储在
m

中,这是一项非常简单的awk任务:

awk -F ' [:-] ' '
    $2 == prev2 {        # if the 2nd field matches the previous 2nd field,
        print prevline   #   print the previous line
        print            #   print the current line
        getline; print   #   get the next line and print it
    } 
    {prev2 = $2; prevline = $0}  # remember these values for the next iteration
' file

与sed相比,Awk更适合于诸如“if”之类的逻辑构造

$ awk 'substr($0,4,5)==last{print lastline;print;getline;print;} {last=substr($0,4,5);lastline=$0;}' input.txt
ble : 1 - etc
blf : 1 - etc
blg : a - etc
我假设您知道需要什么,而不是用空格分隔的字段来分隔行,
:1-
才是您真正需要的。如果您的输入数据与示例不匹配,请随意更正。

您可以使用egrep:

egrep -A2 ": 1 -" filename
其中A2显示找到模式后的下两行

输出:

bla : 1 - etc
blb : a - etc
blc : 2 - etc
--
ble : 1 - etc
blf : 1 - etc
blg : a - etc
blh : 1 - etc
bli : a - etc
是的,awk:

awk '/: 1 -/  {++i}
     i>1      {print p}
     !/: 1 -/ {if(i>1)print;i=0}
              {p=$0}
     END      {if(i>1)print p}'

如果第一列以bl开头,以e、f或g结尾,请打印这些行。

这里不清楚您的意思。请把它弄清楚,你建议OP寻找什么样的模式?
awk '/: 1 -/ {CNT++; x[CNT]=$0; next} CNT==2 {print x[1]; print x[2]; print $0} {CNT=0}' *.*
awk '$1 ~/^bl$|e|f|g/' file
ble : 1 - etc
blf : 1 - etc
blg : a - etc