从第一个单词的周围行第二个单词grep

时间:2011-03-03 15:03:24

标签: shell awk

我有一个这样的文件:

ABC1  OBJECT-TYPE
...
...
KEY { XYZ1 }
...
...

ABC2  OBJECT-TYPE
...
...
ABC3  OBJECT-TYPE
...
...
KEY { XYZ3 }
...
...

我的第一个搜索词是KEY(因为它在文件中少发生),第二个搜索词是OBJECT-TYPE。 OBJECT-TYPE可以在KEY的线上方出现几行(可能是5或10)。如果在文件中找到KEY,我需要具有键值和对应的对象类型值的输出。

完全像:

  

ABC1 KEY1

     

ABC2 KEY2

4 个答案:

答案 0 :(得分:0)

以下内容可能已经结束。它适用于给定的输入,但它做出了我不知道的假设。例如,它假定大括号在它们和键值之间有空格。

#!/usr/bin/awk -f

/OBJECT-TYPE/ {
  for(i=2; i<=NF; i++) {
     if( $i ~ /OBJECT-TYPE/ )
        key = $(i-1);
  }
}

/KEY +\{.*\}/ {
   for(i=1; i < NF; i++) {
      if ( $i == "KEY" ) {
         print key, $(i+2);
      }
   }
}

答案 1 :(得分:0)

很难说出你真正要做的事情。

awk '/OBJECT-TYPE/ {a[$1]=$1} /KEY/ { print a["ABC" substr($3,length($3))], $1; split("",a) }'

答案 2 :(得分:0)

假设您想要所有对象的所有键,并且键列在对象下面,那么您可以这样做:

awk '/OBJECT-TYPE/ { obj= $1 } /KEY { .* }/ { print obj, $3 }' file.txt

输出:

ABC1 XYZ1
ABC3 XYZ3

如果您只想要每个对象树中第一个对象的键,其中对象树由空行分隔,您应该尝试这样:

awk 'BEGIN { nl=1 } /^$/ { nl=1 }  /OBJECT-TYPE/ && nl { obj= $1; nl=0; } /KEY { .* }/ { print obj, $3 }' file.txt

输出:

ABC1 XYZ1
ABC2 XYZ3

答案 3 :(得分:0)

可能更容易迭代文件向后,找到关键字和关键字后面的所有对象类型

tac filename | awk '/KEY/ {key = $3} /OBJECT-TYPE/ {print $1, key}'

鉴于上面的示例,此输出

ABC3 XYZ3
ABC2 XYZ3
ABC1 XYZ1

如果您需要输出显示与原始文件相同的顺序,请将|tac添加到管道。