[英]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=1
的BEGIN
部分,它应该在任何情况下都匹配字符串。
说明:以下仅用于说明目的,请参考上面的完整代码。
-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 将第二个字段分别放入lag
和description
关键字的l
和d
变量中。
最后一条语句打印与port
关键字关联的 2 个变量和第二个字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.