首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用bash将路由器配置部分转换为csv文件

使用bash将路由器配置部分转换为csv文件
EN

Stack Overflow用户
提问于 2019-10-02 23:54:47
回答 2查看 74关注 0票数 2

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

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

代码语言:javascript
复制
# 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”之间的每个块中使用逗号分隔行,如下所示:

代码语言:javascript
复制
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 

然后,我会像这样导入到一个表中:

代码语言:javascript
复制
lag-id | description | key | port

我已经尝试了在这里找到的各种awk一行程序,例如:

代码语言:javascript
复制
awk -v RS="lag" 'NR>1{$1=$1; print RS, $0}' 

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

代码语言:javascript
复制
 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"
EN

回答 2

Stack Overflow用户

发布于 2019-10-03 00:14:58

代码语言:javascript
复制
$ 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
票数 1
EN

Stack Overflow用户

发布于 2019-10-03 00:20:03

你可以尝试一下吗?(因为我是在手机上写的,所以我不能测试它,但应该可以工作)

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58205101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档