我正在尝试在我的 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
}
我需要了解如何搜索我的 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
}