【问题标题】:Convert section of router configuration to csv file with bash使用 bash 将路由器配置部分转换为 csv 文件
【发布时间】:2019-10-02 15:54:47
【问题描述】:

类似于my previous question,但在配置文件示例中添加了其他项目。

我有一个配置文件,其中包含重复的行组(但组中的行数不同),我想将其组合到单个 csv 行以便更轻松地导入数据库。 (数据库结构灵活)。

# Example: 
    lag 1
        description "LAG-1 GOES TO LAG-2"
        port 1/2/1 
        port 1/2/2 
        port 3/2/3 
        lacp active administrative-key 32770
    exit
    lag 10
        description "REMOVED-LAG-10-0.0.0.0"
        port 4/1/1 
        port 5/1/1
        lacp active administrative-key 32771
    exit
    lag 11
        description "REMOVED-LAG-11-4.4.4.4"
        port 5/1/2 
        lacp active administrative-key 32772
    exit

我最终需要为“lag”和“exit”之间的每个块使用逗号分隔的行,如下所示:

1,"LAG 1 GOES TO LAG-2",32770,1/2/3
1,"LAG 1 GOES TO LAG-2",32770,1/2/2
1,"LAG 1 GOES TO LAG-2",32770,3/2/3 
10,"REMOVED-LAG-10-0.0.0.0",32771,4/1/1
10,"REMOVED-LAG-10-0.0.0.0",32771,5/1/1
11,"REMOVED-LAG-11-4.4.4.4",32772,5/1/2 

然后我会导入这样的表:

lag-id | description | key | port

我尝试了在这里找到的各种 awk one-liners,例如:

awk -v RS="lag" 'NR>1{$1=$1; print RS, $0}' 

但这似乎会垂直压缩线条,所以我最终得到了

 exit 3/2/3  "LAG 1 GOES TO LAG-2"
 exit 4/2/3  "LAG 10 GOES TO LAG-3"
 exit 4/1/1  "LAG 11 GOES TO LAG-21"

【问题讨论】:

  • 能否请您检查一下我的答案并告诉我这是否有帮助?

标签: bash awk config


【解决方案1】:
$ cat tst.awk
BEGIN { OFS="," }
{
    tag = $1
    val = ( match($0,/"[^"]*"/) ? substr($0,RSTART,RLENGTH) : $NF )

    if ( tag == "port" ) {
        ports[++numPorts] = val
    }
    else {
        vals[++numVals] = val
    }
}

tag == "exit" {
    for (portNr=1; portNr<=numPorts; portNr++) {
        for (valNr=1; valNr<numVals; valNr++) {
            printf "%s%s", vals[valNr], OFS
        }
        print ports[portNr]
    }
    numPorts = numVals = 0
}

$ awk -f tst.awk file
1,"LAG-1 GOES TO LAG-2",32770,1/2/1
1,"LAG-1 GOES TO LAG-2",32770,1/2/2
1,"LAG-1 GOES TO LAG-2",32770,3/2/3
10,"REMOVED-LAG-10-0.0.0.0",32771,4/1/1
10,"REMOVED-LAG-10-0.0.0.0",32771,5/1/1
11,"REMOVED-LAG-11-4.4.4.4",32772,5/1/2

【讨论】:

    【解决方案2】:

    请您尝试一下。(因为我是在手机上写的,所以无法测试但应该可以)

    awk -v OFS=","  '
    {
      gsub(/\r/,"")
      sub(/^ +/,"")
    }
    /lag/{
      ind=$2
      next
    }
    /description/ && match($0,/\".*\"/){ 
     desc=substr($0,RSTART,RLENGTH)
     next
    }
    /port/{
     a[++count]=$2
     next
    }
    /lacp active/{
     for(j=1;j<=count;j++){
       print Ind,desc,$NF,a[j]
     }
     count=""
     delete a
    }
    '  Input_file
    

    【讨论】:

    • @Danny Z,您能否检查一下这个答案,如果这有帮助,请告诉我?
    猜你喜欢
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2021-07-22
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多