我正在摸索似乎有可能常见的需求,但我无法在网络上找到任何示例.
我有这样一个文件:
answer VNET_1_DHCP yes
answer VNET_1_DHCP_CFG_HASH 4CF2C196E368CE83B9D1895C5E05301CDFDEBCA0
answer VNET_1_HOSTONLY_NETMASK 255.255.255.0
answer VNET_1_HOSTONLY_SUBNET 192.168.224.0
answer VNET_1_VIRTUAL_ADAPTER yes
answer VNET_8_DHCP yes
answer VNET_8_DHCP_CFG_HASH D326C0BC7FF6C38C57AF341F9075E576C175B250
answer VNET_8_HOSTONLY_NETMASK 255.255.255.0
answer VNET_8_HOSTONLY_SUBNET 172.16.102.0
answer VNET_8_NAT yes
answer VNET_8_VIRTUAL_ADAPTER yes
Run Code Online (Sandbox Code Playgroud)
我需要提取特定子网的VNET号(192.168.224.0).VNET数量可能会有所不同(从理论上讲,子网甚至不存在).所以我需要匹配子网是否存在,如果存在则提取网络号(1在本例中).
我发现在BASH中实现它非常容易:
if grep -q 192.168.224.0 ./networking; then
echo "The ${VMNET_SUBNET} network already exists"
NETWORK_NUMBER=$(grep ${VMNET_SUBNET} ./networking | cut -d'_' -f 2)
echo NETWORK_NUMBER
else <do something to create it.....>
Run Code Online (Sandbox Code Playgroud)
我试图找到使用Go实现这个的最简单方法.
谢谢.
您可以使用正则表达式:
re := regexp.MustCompile(`.*VNET_(\d+)_.*192.168.224.0`)
matches := re.FindStringSubmatch(text)
fmt.Println(matches[1])
Run Code Online (Sandbox Code Playgroud)
游乐场:http://play.golang.org/p/NQlA2BObtU.
这是一种基于 @ainar-g 的答案来解析这些数据的可靠方法:
http://play.golang.org/p/6-PELcLvVz
这里的目标是使用以下类型将每个 VNET 的属性存储在地图中:
type vnet map[int]map[string]string
Run Code Online (Sandbox Code Playgroud)
这段代码:
var re = regexp.MustCompile(`.*VNET_(\d+)_([^\s]+) (.*)`)
func ReadVnet(r io.Reader) vnet {
s := bufio.NewScanner(r)
v := make(vnet)
for s.Scan() {
matches := re.FindStringSubmatch(s.Text())
id, err := strconv.Atoi(matches[1])
if err != nil {
continue
}
if _, ok := v[id]; !ok {
v[id] = make(map[string]string)
}
v[id][matches[2]] = matches[3]
}
return v
}
Run Code Online (Sandbox Code Playgroud)
创建有问题的地图:
map[1:map[DHCP:yes DHCP_CFG_HASH:4CF2C196E368CE83B9D1895C5E05301CDFDEBCA0 HOSTONLY_NETMASK:255.255.255.0 HOSTONLY_SUBNET:192.168.224.0 VIRTUAL_ADAPTER:yes] 8:map[DHCP:yes DHCP_CFG_HASH:D326C0BC7FF6C38C57AF341F9075E576C175B250 HOSTONLY_NETMASK:255.255.255.0 HOSTONLY_SUBNET:172.16.102.0 NAT:yes VIRTUAL_ADAPTER:yes]]
Run Code Online (Sandbox Code Playgroud)
现在您可以在地图上迭代以查找感兴趣的项目:
func main() {
v := ReadVnet(bytes.NewBufferString(text))
for id, properties := range v {
if ip, ok := properties["HOSTONLY_SUBNET"]; ok && ip == "192.168.224.0" {
fmt.Println(id)
return
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5092 次 |
| 最近记录: |