如何连续两行awk模式?

时间:2014-03-25 07:28:05

标签: awk

我正在尝试做一些我认为可以很容易完成的事情,但我似乎无法找到答案。我想使用awk来挑选两个模式之间的线条,但我也希望模式匹配两个连续的线条。我试图在互联网上找到解决方案,或许我没有搜索正确的关键字。一个例子可以更好地描述这一点。

假设我有以下名为test的文件:

aaaa
bbbb

   SOME CONTENT 1

ddddd    
fffff


aaaa    
cccc

    SOME CONTENT 2

ccccc    
fffff

例如,假设我想找到" SOME CONTENT 1"

然后我会像这样使用awk:

  cat test | awk  '/aaa*/ { show=1} show; /fff*/ {show=0}'

但这不是我想要的。我想以某种方式进入模式:

  aaaa*\nbbbb*

结束模式也一样。有什么建议怎么做?

3 个答案:

答案 0 :(得分:3)

您可以使用:

awk  '/aaa*/ {f=1} /bbb*/ && f {show=1} show; /fff*/ {show=f=0}' file
bbbb

   SOME CONTENT 1

ddddd
fffff

如果pattern1为aaa*,则设置标记f
如果pattern2为bbb*且标志f为true,则设置show标志


如果您需要打印patter1 aaa*

awk  '/aaa*/ {f=$0} /bbb*/ && f {show=1;$0=f RS $0} show; /fff*/ {show=f=0}' file
aaaa
bbbb

   SOME CONTENT 1

ddddd
fffff

答案 1 :(得分:1)

如果每条记录以fffff结尾,并且GNU awk可用,您可以执行以下操作:

$ awk '/aaa*\nbbbb*/' RS='fffff' file
aaaa
bbbb

   SOME CONTENT 1

ddddd

或者,如果您只想显示SOME CONTENT 1,则可以执行以下操作:

$ awk -F $'\n' '/aaa*\nbbbb*/{print $4}' RS='fffff' file
   SOME CONTENT 1

答案 2 :(得分:0)

我搜索了两个模式并检查它们是否连续使用行号,行号允许sed在它们之间插入一行,就在第一行/模式之后。

awk '$0 ~ "Encryption" {print NR} $0 ~ "Bit Rates:1" {print NR}' /tmp/mainscan | while read line1; do read line2; echo "$(($line2 - 1)) $line1"; done > /tmp/this



    while read line 
    do 
    pato=$(echo $line | cut -f1 -d' ') 
    patt=$(echo $line | cut -f2 -d' ') 
    if [[ "$pato" = "$patt" ]]; then 
       inspat=$((patt + 1)) 
       sed -i "${inspat}iESSID:##" /tmp/mainscan 
       sed -i 's/##/""/g' /tmp/mainscan 
    fi 
    done < /tmp/this