我有一个这样的文件:
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
答案 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
添加到管道。