使用列 - awk 和 sed

bou*_*rne 4 bash sed awk

我正在尝试解析由 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
Run Code Online (Sandbox Code Playgroud)

文本文件中有很多我不感兴趣的其他垃圾。我只想要包含交换机号和端口的行 - 上面示例中的“1/g23”。

我对文件做了一个 grep 来提取包含模式 '/g' 的行,它工作得很好。

现在我想要的只是中间的两列。我使用 awk 打印列。

0000.0000.0000 1/g23
Run Code Online (Sandbox Code Playgroud)

既然完成了,我想搭上“。” sed 为此工作正常

000000000000 1/g23
Run Code Online (Sandbox Code Playgroud)

从这里我只想将第一列转换为 MAC 地址格式。

So this
000000000000 1/g23
Becomes this
00:00:00:00:00:00 1/g23
Run Code Online (Sandbox Code Playgroud)

我能够找到一个可以完成此任务的 sed 命令。但我的问题是我只需要在第一列上完成。我不太确定如何只编辑一列而不丢失 MAC 和端口之间的关联。

grep -e "/g" switch6output | awk '{print $2,$3}' | sed 's/\.//g' | sed 's/../&:/g;s/:$//'
Run Code Online (Sandbox Code Playgroud)

我敢肯定这是一种非常愚蠢的方法,但这是我能想到的最好的方法。有没有更可靠的方法可以在不丢失 MAC 和端口关联的情况下完成我需要的操作?

谢谢你。

Ulr*_*gel 6

直接使用awk即可:

awk '/\/g/ {
        gsub(/\./, "", $2)
        gsub(/../, "&:", $2)
        sub(/:$/, "", $2) 
        print $2,$3
}'
Run Code Online (Sandbox Code Playgroud)

有了这个解决方案不需要grep也不sed。


cho*_*oba 5

唯一的sed例子:

sed -r '\=1/g23=!d;
        s/[^ ]* *//;
        s/ *[^ ]* *$//;
        s/(..)\.(..)/:\1:\2:/g;
        s/::/:/'
Run Code Online (Sandbox Code Playgroud)

如果您的输入包含制表符而不是空格,则必须调整表达式。