Awk 在文件中搜索字符串,然后查找与不同字符串匹配的前几行

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

我有一些硬件负载平衡器配置,我想使用任何可用的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 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$”的行尾标识符,但是,这不是正确的语法。我调整了脚本以修复此问题。对于未来的问题——当发布样本输入/输出时,如果你把思想放进去,并提出一些边缘情况,就像你第一次发表你的问题时提到的那样,那么我们就可以非常有用了,所以当我们试图帮助你想出一个解决方案时,我们可以考虑它们,而不是在以后发现和调试它们。