Awk 在文件中搜索字符串,然后查找与不同字符串匹配的前几行
我有一些硬件负载平衡器配置,我想使用任何可用的linux工具(例如sed、awk、grep等)来解析它们 我想搜索短语Awk 在文件中搜索字符串,然后查找与不同字符串匹配的前几行,awk,sed,grep,Awk,Sed,Grep,我有一些硬件负载平衡器配置,我想使用任何可用的linux工具(例如sed、awk、grep等)来解析它们 我想搜索短语地址10.1.104.164,我想知道它所在的池。例如,如果我们搜索10.1.104.164,我希望它返回: ltm pool pool_10.1.105.30_80 ltm pool pool_10.1.105.31_80 以下是我正在搜索的文件示例: ltm pool pool_10.1.105.30_80 { load-balancing-mode observe
地址10.1.104.164
,我想知道它所在的池。例如,如果我们搜索10.1.104.164
,我希望它返回:
ltm pool pool_10.1.105.30_80
ltm pool pool_10.1.105.31_80
以下是我正在搜索的文件示例:
ltm pool pool_10.1.105.30_80 {
load-balancing-mode observed-member
members {
node_10.1.104.163:http {
address 10.1.104.163
session monitor-enabled
state up
}
node_10.1.104.164:http {
address 10.1.104.164
session monitor-enabled
state up
}
}
monitor http_200_OK
}
ltm pool pool_10.1.105.31_80 {
load-balancing-mode observed-member
members {
node_10.1.104.163:http {
address 10.1.104.163
session monitor-enabled
state up
}
node_10.1.104.164:http {
address 10.1.104.164
session monitor-enabled
state up
}
}
monitor http_200_OK
}
提前感谢,,
克里斯
编辑:拼写和格式 使用
perl
:
$ awk -v tgt="address 10.1.104.164" '
/^ltm pool/ { pool=$0; sub(/ *{ *$/,"",pool) }
index($0" ",tgt" ") { print pool }
' file
ltm pool pool_10.1.105.30_80
ltm pool pool_10.1.105.31_80
$ perl -0777 -lne 'while (/^(ltm pool pool_[\d._]+)(.*?)(?=^\})/gms){
$m=$1; $t=$2;
print "$m\n" if ($t =~ /address 10\.1\.104\.164/)}' file
ltm pool pool_10.1.105.30_80
ltm pool pool_10.1.105.31_80
这样比较好,谢谢!但是,我遇到了一个问题,假设地址行是“address 10.1.104.16”,如果我们运行这个awk命令,它将匹配10.1.104.16和10.1.104.164,这将产生错误的结果。我认为我们需要设置tgt=“address 10.1.104.164”以具有类似于tgt=“address 10.1.104.164$”的行尾标识符,但是,这不是正确的语法。我调整了脚本以修复此问题。对于未来的问题——当发布样本输入/输出时,如果你把思想放进去,并提出一些边缘情况,就像你第一次发表你的问题时提到的那样,那么我们就可以非常有用了,所以当我们试图帮助你想出一个解决方案时,我们可以考虑它们,而不是在以后发现和调试它们。