更改匹配变量行中的第一个单词

时间:2018-04-18 13:49:25

标签: bash

如果我想要的东西与标题不匹配,我想不出一个合适的标题,请原谅我。

我有一个配置,可以从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的模式语句。

1 个答案:

答案 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可能与其他名称没有冲突,但是是一个很好的指示/文档,原始条目是什么。