我正在尝试解析由 expec 脚本生成的文本文件,该脚本从交换机中提取一些信息。
这是一个示例输出:
192 0000.0000.0000 1/g23 Dynamic
192 0000.0000.0000 ch1 Dynamic
192 0000.0000.0000 ch1 Dynamic
192 0000.0000.0000 ch1 Dynamic
该文本文件中有很多我不感兴趣的其他垃圾。我只想要包含交换机号和端口的行 - 上例中的“1/g23”。
我在文件上执行了 grep 来提取包含模式“/g”的行,效果很好。
现在我想要的只是中间的两列。我使用 awk 打印列。
0000.0000.0000 1/g23
现在已经完成了,我想乘坐“.”。 sed 对此工作正常
000000000000 1/g23
从这里我只想将第一列转换为 MAC 地址格式。
So this
000000000000 1/g23
Becomes this
00:00:00:00:00:00 1/g23
我找到了一个可以完成此任务的 sed 命令。但我的问题是我只需要在第一列上完成它。我不太确定如何只编辑一列而不丢失 MAC 和端口之间的关联。
grep -e "/g" switch6output | awk '{print $2,$3}' | sed 's/\.//g' | sed 's/../&:/g;s/:$//'
我确信这是一种非常愚蠢的方法,但这是我能想到的最好的方法。有没有更可靠的方法可以在不丢失 MAC 和端口关联的情况下完成我的需要?
谢谢。
答案1
直接使用awk即可:
awk '/\/g/ {
gsub(/\./, "", $2)
gsub(/../, "&:", $2)
sub(/:$/, "", $2)
print $2,$3
}'
有了这个解决方案,您既不需要grep
也不需要sed
。
答案2
仅sed
示例:
sed -r '\=1/g23=!d;
s/[^ ]* *//;
s/ *[^ ]* *$//;
s/(..)\.(..)/:\1:\2:/g;
s/::/:/'
如果您的输入包含制表符而不是空格,则必须调整表达式。