繁体   English   中英

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

[英]Convert router configuration file to csv with bash or python

我有一个包含重复行组(但组中行数不同)的配置文件,我想将其组合到单个 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 单线,我在这里找到,例如:

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"

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

请您尝试以下操作。

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=","将 output 字段分隔符设置为所有行的逗号。

gsub(/\r/,"")根据 OP 的评论,用 NULL 全局替换 \r 控制 m 个字符。

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

/lag/{Ind=$2;next}搜索其中包含字符串 lag 的行并创建值为 $2 next 的变量 Ind 将跳过从这里开始的所有进一步语句。

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

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

$ 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

另一个 awk:

awk '$1~/lag/{l=$2;next}
     $1~/description/{d=substr($0,index($0,"\""));next}
     $1~/port/{print l,d,$2}
' OFS=, file

2 first statements 将第二个字段分别放入lagdescription关键字的ld变量中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM