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

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

Stack Overflow用户
提问于 2019-10-02 21:43:20
回答 3查看 286关注 0票数 1

我有一个配置文件,其中包含重复的行组(但组中的行数不同),我希望将其合并为单个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"

编辑:略微更新了配置,描述可能有两次LAG-x数字。编辑2:已更新添加lacp值以获取每条csv线路的管理员密钥。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-02 21:58:36

你能不能试着跟上。

代码语言:javascript
复制
awk -v OFS="," '
{
  gsub(/\r/,"")
  sub(/^ +/,"")
}
/lag/{
  ind=$2
  next
} 
/description/ && match($0,/\".*\"/){ 
 des=substr($0,RSTART,RLENGTH)
 next
}
/port/{
 print ind,des,$2
}
'  Input_file

如果您的字符串可能是大写或小写字母或混合,那么您可以在上面的代码中添加一个带有IGNORECASE=1BEGIN部分,它应该在任何情况下都与字符串匹配。

说明:以下内容仅作说明之用,请参考以上完整代码。

-v OFS=","将所有行的输出字段分隔符设置为逗号。

gsub(/\r/,"")根据OP的注释,将\r控制m个字符全局替换为NULL。

sub(/^ +/,"")在这里用NULL替换行的初始空格。

/lag/{Ind=$2;next}搜索其中有字符串滞后的行,并创建值为$2的变量Ind,next将跳过从此处开始的所有后续语句。

/description...../查找其中包含字符串描述的行,然后使用awk的匹配函数查找同一行中从""的正则表达式。将匹配的regex值保存在名为desc的变量中,next将跳过此处的所有后续语句。

/port/...查找其中包含字符串端口的行,然后根据OP的要求在此处打印ind,des,$2的值。

票数 1
EN

Stack Overflow用户

发布于 2019-10-02 23:21:28

代码语言:javascript
复制
$ cat tst.awk
BEGIN { OFS="," }
{
    tag = $1
    sub(/^[[:space:]]*[^[:space:]]+[[:space:]]*/,"")
    vals[++numVals] = $0
}
tag == "exit" {
    for (valNr=3; valNr<numVals; valNr++) {
        print vals[1], vals[2], vals[valNr]
    }
    numVals = 0
}

$ awk -f tst.awk file
1,"LAG-1 GOES TO LAG-2",1/2/1
1,"LAG-1 GOES TO LAG-2",1/2/2
1,"LAG-1 GOES TO LAG-2",3/2/3
10,"REMOVED-LAG-10-0.0.0.0",4/1/1
10,"REMOVED-LAG-10-0.0.0.0",5/1/1
11,"REMOVED-LAG-11-4.4.4.4",5/1/2
票数 1
EN

Stack Overflow用户

发布于 2019-10-02 23:00:18

另一个awk:

代码语言:javascript
复制
awk '$1~/lag/{l=$2;next}
     $1~/description/{d=substr($0,index($0,"\""));next}
     $1~/port/{print l,d,$2}
' OFS=, file

前两个语句将第二个字段分别放入ld变量中,分别用于lagdescription关键字。

最后一条语句打印2个变量和与port关键字关联的第二个字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58202817

复制
相关文章

相似问题

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