gpt4 book ai didi

bash - 将 shell 输出绑定(bind)到 Go 中的结构的最佳方法?

转载 作者:行者123 更新时间:2023-12-05 02:26:25 38 4
gpt4 key购买 nike

我有一些芯片在某些硬件上运行,我想将 shell 命令的输出绑定(bind)到一个结构以进行报告/登录。

Num item1: 2
INDEX LOAD MODEL_LOAD INST MEM SHARE_MEM P2P_MEM DEVICE NAMESPACE
1 2 3 4 50 600 700 1 1
1a 2b 3c 4c 5d 6e 7f 2 2
Num item2: 2
INDEX LOAD MODEL_LOAD INST MEM SHARE_MEM P2P_MEM DEVICE NAMESPACE
2a 2b 2c 3 0 0 0 1 1
1 0 0 0 0 0 0 2 2
**************************************************

尝试

cat out.txt | grep -i "Num $1" -A 3 | grep -i nvme | tr -s ' ' | cut -d' ' -f1-7

这实际上还不算太糟糕,我可以传入一个参数,如 decodersencoders 并获取每个芯片的负载指标。但是,我现在很好奇将它绑定(bind)到 Go 中的结构的最佳方法。

目前,我能做的是编写一个自定义反序列化器,例如:

func main() {
out, err := exec.Command("/bin/sh", "metrics.sh", "encoders").Output()
if err != nil {
fmt.Println(err)
log.Fatal(err)
}

fmt.Println(string(out))
}

但我觉得必须有更好的方法,比如输出为 JSON 并绑定(bind)到结构或其他东西。

最佳答案

我会将您的输入文件转换为 CSV,因为它适合原始表格数据,也因为 Go 语言在其标准库中有 CSV 编码器/解码器:

awk -v OFS=',' '
$1 == "Num" {
count = $3
type = $2

getline
if ( !header++ ) {
$(NF+1) = "ID"
print
}
for ( id = 1; id <= count; id++ ) {
getline
$(NF+1) = type id
print
}
}
' file.txt

警告:代码不会对字段进行 CSV 转义

INDEX,LOAD,MODEL_LOAD,INST,MEM,SHARE_MEM,P2P_MEM,DEVICE,NAMESPACE,ID
1,2,3,4,50,600,700,/dev/nvme0,/dev/nvme0n1,decoders:1
1a,2b,3c,4c,5d,6e,7f,/dev/nvme1,/dev/nvme1n1,decoders:2
2a,2b,2c,3,0,0,0,/dev/nvme0,/dev/nvme0n1,encoders:1
1,0,0,0,0,0,0,/dev/nvme1,/dev/nvme1n1,encoders:2
0,0,0,0,0,0,0,/dev/nvme0,/dev/nvme0n1,scalers:1
1,0,0,0,0,0,0,/dev/nvme1,/dev/nvme1n1,scalers:2

注意用 Go 为您的输入格式编写解析器应该不难

关于bash - 将 shell 输出绑定(bind)到 Go 中的结构的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73790001/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com