解析 snmpwalk 输出
Parsing snmpwalk output
我知道这里有很多关于解析 snmpwalk 响应的问题和答案,但我似乎无法在这里找到相关的答案。我不擅长解析文本,但我正在尽我最大的努力学习东西。
我正在使用以下命令轮询我的 Juniper 设备:
snmpwalk -v2c -c blablabla x.x.x.x iso.3.6.1.2.1.2.2.1.2
收到如下回复:
iso.3.6.1.2.1.2.2.1.2.2548 = STRING: "xe-4/0/1.3461"
iso.3.6.1.2.1.2.2.1.2.2549 = STRING: "xe-4/0/2.3462"
iso.3.6.1.2.1.2.2.1.2.2550 = STRING: "xe-4/0/2.3461"
iso.3.6.1.2.1.2.2.1.2.2551 = STRING: "xe-4/0/3.3462"
iso.3.6.1.2.1.2.2.1.2.2552 = STRING: "xe-4/0/3.3461"
iso.3.6.1.2.1.2.2.1.2.2557 = STRING: "xe-4/2/1.1514"
iso.3.6.1.2.1.2.2.1.2.2558 = STRING: "xe-4/2/1.1634"
由于此特定设备上有许多接口,因此省略了输出。
我需要解析此输出,以便我只能获得物理接口。例如字符串外:
iso.3.6.1.2.1.2.2.1.2.2557 = STRING: "xe-4/2/1.1514"
我只需要提取 xe-4/2/1 等其他行。基本上,在字符“点之前的所有内容之后。请注意,有这样的行:
iso.3.6.1.2.1.2.2.1.2.1664 = STRING: "xe-4/3/3"
iso.3.6.1.2.1.2.2.1.2.1665 = STRING: "xe-4/1/3.534"
iso.3.6.1.2.1.2.2.1.2.1666 = STRING: "xe-4/1/3.552"
iso.3.6.1.2.1.2.2.1.2.1667 = STRING: "xe-4/3/0.1613"
iso.3.6.1.2.1.2.2.1.2.1296 = STRING: "ae2.1464"
iso.3.6.1.2.1.2.2.1.2.1297 = STRING: "ae2.1503"
iso.3.6.1.2.1.2.2.1.2.1299 = STRING: "ae2.1596"
iso.3.6.1.2.1.2.2.1.2.1300 = STRING: "ae2.2020"
我的最终目标是从这个特定设备中提取所有物理接口。与接口相关的唯一 OID 似乎是 iso.3.6.1.2.1.2.2.1.2 并且在池化设备时它输出所有接口,包括物理和逻辑接口。
非常感谢
您可以使用这个 sed 命令:
sed -i.bak 's/\([^"]*"[^.]*\).*/"/' file
使用 sed 命令
sed 's#iso.*= STRING: "\([^".]\+\).*##g' my_file
编辑:使用上面的 sed 命令的解释
#
我使用 #
作为 sed 的分隔符。你可以使用任何其他字符,例如“%”、“~”等...使用不与任何字符冲突的字符是明智的你的模式或变量
iso.*= STRING: "
- 匹配字符串 iso
后跟任何字符后跟字符串 =STRING: "
的模式
\([^".]\+\)
- 这是上述模式的延续。这部分 [^".]\+
匹配一个或多个不是 "
或 .
的字符。 \+
表示 1 个或多个字符。注意我用 \( \)
将这块图案括起来。这是因为我想让 sed 记住这个模式。因为这是我封闭的第一个模式,sed 将这个模式定义为 </code>。将 <code>
视为第一个模式的变量名。所以在模式 iso.*= STRING: "
sed 搜索所有不是 "
或 .
的字符并记住它之后,这是我们 answer.This 存储的模式我希望 sed 替换整行与.
.*
- 匹配标记模式后的零个或多个字符。我使用它的原因是它匹配行的其余部分并用标记的模式替换整行,即 </code>.</p>
<p>注意:只有当您将整行与一个模式匹配,然后在您的正则表达式中标记该模式的一部分以进行替换时,这才会起作用。如果找不到整个模式,则不会进行替换。</p>
<p><strong>使用 awk 命令</strong></p>
<pre><code>awk -v FS="( \"|[.][0-9]+\"$|\"$)" '[=11=]~/iso.*= STRING: "/{print }' my_file
我知道这里有很多关于解析 snmpwalk 响应的问题和答案,但我似乎无法在这里找到相关的答案。我不擅长解析文本,但我正在尽我最大的努力学习东西。
我正在使用以下命令轮询我的 Juniper 设备:
snmpwalk -v2c -c blablabla x.x.x.x iso.3.6.1.2.1.2.2.1.2
收到如下回复:
iso.3.6.1.2.1.2.2.1.2.2548 = STRING: "xe-4/0/1.3461"
iso.3.6.1.2.1.2.2.1.2.2549 = STRING: "xe-4/0/2.3462"
iso.3.6.1.2.1.2.2.1.2.2550 = STRING: "xe-4/0/2.3461"
iso.3.6.1.2.1.2.2.1.2.2551 = STRING: "xe-4/0/3.3462"
iso.3.6.1.2.1.2.2.1.2.2552 = STRING: "xe-4/0/3.3461"
iso.3.6.1.2.1.2.2.1.2.2557 = STRING: "xe-4/2/1.1514"
iso.3.6.1.2.1.2.2.1.2.2558 = STRING: "xe-4/2/1.1634"
由于此特定设备上有许多接口,因此省略了输出。 我需要解析此输出,以便我只能获得物理接口。例如字符串外:
iso.3.6.1.2.1.2.2.1.2.2557 = STRING: "xe-4/2/1.1514"
我只需要提取 xe-4/2/1 等其他行。基本上,在字符“点之前的所有内容之后。请注意,有这样的行:
iso.3.6.1.2.1.2.2.1.2.1664 = STRING: "xe-4/3/3"
iso.3.6.1.2.1.2.2.1.2.1665 = STRING: "xe-4/1/3.534"
iso.3.6.1.2.1.2.2.1.2.1666 = STRING: "xe-4/1/3.552"
iso.3.6.1.2.1.2.2.1.2.1667 = STRING: "xe-4/3/0.1613"
iso.3.6.1.2.1.2.2.1.2.1296 = STRING: "ae2.1464"
iso.3.6.1.2.1.2.2.1.2.1297 = STRING: "ae2.1503"
iso.3.6.1.2.1.2.2.1.2.1299 = STRING: "ae2.1596"
iso.3.6.1.2.1.2.2.1.2.1300 = STRING: "ae2.2020"
我的最终目标是从这个特定设备中提取所有物理接口。与接口相关的唯一 OID 似乎是 iso.3.6.1.2.1.2.2.1.2 并且在池化设备时它输出所有接口,包括物理和逻辑接口。
非常感谢
您可以使用这个 sed 命令:
sed -i.bak 's/\([^"]*"[^.]*\).*/"/' file
使用 sed 命令
sed 's#iso.*= STRING: "\([^".]\+\).*##g' my_file
编辑:使用上面的 sed 命令的解释
#
我使用 #
作为 sed 的分隔符。你可以使用任何其他字符,例如“%”、“~”等...使用不与任何字符冲突的字符是明智的你的模式或变量
iso.*= STRING: "
- 匹配字符串 iso
后跟任何字符后跟字符串 =STRING: "
\([^".]\+\)
- 这是上述模式的延续。这部分 [^".]\+
匹配一个或多个不是 "
或 .
的字符。 \+
表示 1 个或多个字符。注意我用 \( \)
将这块图案括起来。这是因为我想让 sed 记住这个模式。因为这是我封闭的第一个模式,sed 将这个模式定义为 </code>。将 <code>
视为第一个模式的变量名。所以在模式 iso.*= STRING: "
sed 搜索所有不是 "
或 .
的字符并记住它之后,这是我们 answer.This 存储的模式我希望 sed 替换整行与.
.*
- 匹配标记模式后的零个或多个字符。我使用它的原因是它匹配行的其余部分并用标记的模式替换整行,即 </code>.</p>
<p>注意:只有当您将整行与一个模式匹配,然后在您的正则表达式中标记该模式的一部分以进行替换时,这才会起作用。如果找不到整个模式,则不会进行替换。</p>
<p><strong>使用 awk 命令</strong></p>
<pre><code>awk -v FS="( \"|[.][0-9]+\"$|\"$)" '[=11=]~/iso.*= STRING: "/{print }' my_file