如果我想要的东西与标题不匹配,我想不出一个合适的标题,请原谅我。
我有一个配置,可以从Cisco设备输出接口统计信息。然后我的脚本通过并解析数据行并将其分离,以便它可以将某些项目导出为CSV。这些脚本适用于所有其他端口,直到它运行到ATM端口。我试图解析的问题数据如下所示:
ATM0/0/0 is up, protocol is up
line 1
line 2
line 3
line 4
ATM0/0/0.1 is up, protocol is up
line 1
line 2
ATM0/0/0.2 is up, protocol is up
line 1
line 2
我解析信息的脚本如下:
cfg=./config.text
inter=$(cat $cfg | grep "protocol is" | awk '{print $1}')
for i in $inter
do
if [[ $i == ATM0/*/0.* ]] ; then
cat $cfg | grep -A2 "$i" | sed -e 's/--//g' -e '/^\s*$/d' | paste -d " " - - - > tmp
grep "$i" ./tmp | while read -r line ; do
sts1=$(echo $line | awk '{print $3}' | sed 's/,//g')
sts2=$(echo $line | awk '{print $6}')
sts3=$(echo $line | awk '{print $8}')
sts4=$(echo $line | awk '{print $10}')
echo "$hostname, $ip, $i, $sts1, $sts2, $sts3, $sts4, NA, NA, NA, NA, NA" >> Details.csv
done
elif [[ $i == ATM0/*/0 ]] ; then
similar coding as above
echo "$var, $var, $var" >> Details.csv
done
fi
done
问题是,由于主ATM和子ATM端口都以ATM开头,我的grep命令无法区分这两者。所以它匹配后接下来的4行" ATM0 / * / 0"。
我试图使用sed尝试将ATM中的子ATM端口更改为唯一名称,以便它可以通过数据处理。我用的代码如下:
if cat $cfg | grep "ATM0/[0-3]/0.[0-3]" ; then
sed -i 's/ATM/SUB_VAR/'
fi
不幸的是,这将所有ATM实例都更改为SUB_VAR。我不确定如何处理这个问题并寻找如何实现这一目标的指导。
更新 每个IF语句应该匹配第一个模式,然后在该模式之后获取一定数量的行并将其放入tmp文件中。从那里开始对每个匹配的模式进行格式化,将其放入一行,如下所示:
ATM0/0/0.1 is up, protocol is up line 1 line 2
ATM0/0/0.2 is up, protocol is up line 1 line 2
ATM0/1/0.1 is up, protocol is up line 1 line 2
ATM0/1/0.2 is up, protocol is up line 1 line 2
从这里我可以使用awk来解析我想要的信息。问题是ATM端口的模式匹配正在抓取ATM和ATM子端口。从那里错误的输出看起来像tmp文件:
ATM0/1/0 is up, protocol is up line 1 line 2 line 3 line 4
ATM0/1/0.1 is up, protocol is up line 1 line 2 ATM0/1/0.2 is up, protocol is up line 1
line 2 FastEthernet0/1 is up, protocol is up line 1
正如你所看到的,它适用于子端口,但正如你可以看到的常规端口,它不应该抓住的东西,我肯定它是因为我用于我的IF的模式语句。
答案 0 :(得分:1)
这有帮助吗?
sed -r "s/ATM0(\/[0-3]+\/0[^.].*)/atm0\1/" atm.log
atm0/0/0 is up, protocol is up
line 1
line 2
line 3
line 4
ATM0/0/0.1 is up, protocol is up
line 1
line 2
ATM0/0/0.2 is up, protocol is up
line 1
line 2
方括号中的点与文字点匹配。插入符号之前否定了它。
使用-i可以更改文件。
sed -r -i "s/ATM0(\/[0-3]+\/0[^.].*)/atm0\1/" atm.log
改变相反的方式:
sed -r "s/ATM0(\/[0-3]+\/0[.].*)/atm0\1/" atm.log
ATM0/0/0 is up, protocol is up
line 1
line 2
line 3
line 4
atm0/0/0.1 is up, protocol is up
line 1
line 2
atm0/0/0.2 is up, protocol is up
line 1
line 2
我猜小写的atm可能与其他名称没有冲突,但是是一个很好的指示/文档,原始条目是什么。