我正在尝试在我的 Cisco ACE 负载平衡配置中搜索 "sections" 文本

I'm trying to search for "sections" of text in my Cisco ACE load balance config

我需要了解如何搜索我的 Cisco ACE 负载平衡配置的完整部分。我正在尝试搜索服务器场,然后在下一个服务器场之前显示该服务器场的所有配置。这都是纯文本,下面是文本可能的样子的示例。

serverfarm host SERVERFARM1-HTTP
  probe TCP_8080
  rserver SERVER1 8080
    inservice
  rserver SERVER2 8080
    inservice
  rserver SERVER3 8080
    inservice
  rserver SERVER4 8080
    inservice
serverfarm host SERVERFARM2-HTTP
  probe TCP_8080
  rserver SERVER1 8080
    inservice
  rserver SERVER2 8080
    inservice

在上面的示例中有两个服务器场,一个 "SERVERFARM1-HTTP" 有四台服务器,另一个 "SEVERFARM2-HTTP" 只有两台服务器。最终我希望能够以某种方式搜索 SERVERFARM1-HTTP 并查看其下的所有 rservers。如有任何帮助,我们将不胜感激。

注意,我使用的是 CentOS。

sed -n '/serverfarm host SERVERFARM1-HTTP/,/serverfarm host SERVERFARM2-HTTP/p' sample.csv

输出:

serverfarm host SERVERFARM1-HTTP
  probe TCP_8080
  rserver SERVER1 8080
    inservice
  rserver SERVER2 8080
    inservice
  rserver SERVER3 8080
    inservice
  rserver SERVER4 8080
    inservice
serverfarm host SERVERFARM2-HTTP

使用 sed,参数化,确保不打印下一个服务器场的第一行,并确保打印列表中的最后一个服务器场:

$ farm='SERVERFARM1-HTTP'
$ sed -n "/$farm/"'{:a;N;$p;/\nserverfarm.*$/!ba;s/\(.*\)\n.*$//p;q}' infile
serverfarm host SERVERFARM1-HTTP
  probe TCP_8080
  rserver SERVER1 8080
    inservice
  rserver SERVER2 8080
    inservice
  rserver SERVER3 8080
    inservice
  rserver SERVER4 8080
    inservice

-n 确保除非明确指示,否则不打印任何内容。其余工作如下:

"/$farm/"' {   # Start of block we want to print
    :a         # Label to branch to
    N          # Append next line to pattern space
    $p         # If we're on the last line: print

    # If the last line in the pattern space is not the start of a new block, branch to a
    /\nserverfarm.*$/!ba
    s/\(.*\)\n.*$//p   # Remove the last line and print the pattern space
    q                    # Quit
}

或者使用 awk(而且几乎肯定不是很优雅):

$ farm=SERVERFARM2
$ awk "/$farm/"' { fl=1; print; next } /serverfarm/ && fl { exit } fl { print }' infile
serverfarm host SERVERFARM2-HTTP
  probe TCP_8080
  rserver SERVER1 8080
    inservice
  rserver SERVER2 8080
    inservice

评论:

# On the starting line of the block we want, set flag, print and go to next cycle
"/$farm/"' {
    fl = 1
    print
    next
}

# If the line matches serverfarm and the flag is set, exit
/serverfarm/ && fl {
    exit
}

# If the flag is set, print line
fl {
    print
}