第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

將 shell 輸出綁定到 Go 中的結(jié)構(gòu)的最佳方法?

將 shell 輸出綁定到 Go 中的結(jié)構(gòu)的最佳方法?

Go
達(dá)令說(shuō) 2023-02-14 18:15:34
我有一些芯片在某些硬件上運(yùn)行,我想將 shell 命令的輸出綁定到一個(gè)結(jié)構(gòu)以進(jìn)行報(bào)告/登錄。Num item1: 2INDEX LOAD MODEL_LOAD INST MEM  SHARE_MEM P2P_MEM DEVICE         NAMESPACE1     2    3          4    50    600         700       1     11a     2b    3c          4c    5d    6e         7f       2     2Num item2: 2INDEX LOAD MODEL_LOAD INST MEM  SHARE_MEM P2P_MEM DEVICE         NAMESPACE2a     2b    2c          3    0    0         0       1     11     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這實(shí)際上還不算太糟糕,我可以傳入一個(gè) argdecoders或encoders并獲取每個(gè)芯片的負(fù)載指標(biāo)。但是,我現(xiàn)在很好奇將它綁定到 Go 中的結(jié)構(gòu)的最佳方法。目前,我能做的是編寫一個(gè)自定義解串器,例如: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 并綁定到結(jié)構(gòu)或其他東西。
查看完整描述

2 回答

?
狐的傳說(shuō)

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超3個(gè)贊

我會(huì)將您的輸入文件轉(zhuǎn)換為 CSV,因?yàn)樗m合原始表格數(shù)據(jù),也因?yàn)?Go 語(yǔ)言在其標(biāo)準(zhǔn)庫(kù)中有一個(gè) 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

警告:代碼不會(huì)對(duì)字段進(jìn)行 CSV 轉(zhuǎn)義


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

NB在 Go 中為您的輸入格式編寫解析器應(yīng)該不會(huì)那么困難


查看完整回答
反對(duì) 回復(fù) 2023-02-14
?
慕斯王

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊

如何直接從您關(guān)心的 Go 文本開始?與使用 shell 實(shí)用程序相比,您在 Go 中擁有更多的控制權(quán)。


這是一個(gè)小型狀態(tài)機(jī),用于查找前導(dǎo)文本“Num”以指示新項(xiàng)目的開始。下一行是標(biāo)題,它被跳過(guò),后面的行被轉(zhuǎn)換為一個(gè)行,被添加到那個(gè)項(xiàng)目。在項(xiàng)目之間的邊界和輸入文本/文件的末尾,最后一個(gè)項(xiàng)目被添加到所有項(xiàng)目的集合中。


package main


import (

    "bufio"

    "fmt"

    "regexp"

    "strings"

)


var txt = `

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

Num item3: 1

INDEX LOAD MODEL_LOAD INST MEM  SHARE_MEM P2P_MEM DEVICE         NAMESPACE

i     iib    iic          iii    zero    zero         zero       i     i

**************************************************

`


var columns = regexp.MustCompile(`\s+`)


type Row struct {

    Index,

    Load,

    Model_Load,

    Inst_Mem,

    Share_Mem,

    P2p_Mem,

    Device,

    Namespace string

}


type Item []Row


func main() {

    r := strings.NewReader(txt)

    scanner := bufio.NewScanner(r)


    items := make([]Item, 0)


    var item Item

    for scanner.Scan() {

        line := scanner.Text()

        line = strings.TrimSpace(line)


        if len(line) == 0 ||

            strings.HasPrefix(line, "***") {

            continue

        }


        // find beginning of an "item": if any previous item, save it and

        // reset item to append future rows; skip header line; continue

        if strings.HasPrefix(line, "Num item") {

            if len(item) > 0 {

                items = append(items, item)

                item = make(Item, 0)

            }

            scanner.Scan() // skip header

            continue

        }


        cols := columns.Split(line, -1)

        row := Row{cols[0], cols[1], cols[2], cols[3], cols[4], cols[5], cols[6], cols[7]}

        item = append(item, row)

    }


    // deal with last/trailing item

    if len(item) > 0 {

        items = append(items, item)

    }


    for i, item := range items {

        fmt.Printf("Item %d\n", i+1)

        for _, row := range item {

            fmt.Println(row)

        }

    }

}

打印以下內(nèi)容:


Item 1

{1 2 3 4 50 600 700 1}

{1a 2b 3c 4c 5d 6e 7f 2}

Item 2

{2a 2b 2c 3 0 0 0 1}

{1 0 0 0 0 0 0 2}

Item 3

{i iib iic iii zero zero zero i}

我不知道有什么更好的方法來(lái)創(chuàng)建結(jié)構(gòu),但它是直接的,而且相當(dāng)干凈。


查看完整回答
反對(duì) 回復(fù) 2023-02-14
  • 2 回答
  • 0 關(guān)注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)