首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed和awk解析ethtool命令输出

使用sed和awk解析ethtool命令输出
EN

Stack Overflow用户
提问于 2022-10-24 07:43:12
回答 1查看 50关注 0票数 0

我正在编写一个shell脚本,从ethtool命令中解析广告模式和支持模式,并将它们与期望值匹配。所期望的和支持的模式都应该有一个共同的值来传递这个条件。

数据:

代码语言:javascript
复制
# ethtool eth5                                                                                                                                                                          
Settings for eth1:                                                                                                                                                                                                       
        Supported ports: [ Backplane ]                                                                                                                                                                                   
        Supported link modes:   1000baseKX/Full                                                                                                                                                                          
                                10000baseKR/Full                                                                                                                                                                         
                                15000baseKR/Full                                                                                                                                                                         
        Supported pause frame use: Symmetric                                                                                                                                                                             
        Supports auto-negotiation: Yes                                                                                                                                                                                   
        Supported FEC modes: None BaseR RS                                                                                                                                                                               
        Advertised link modes:  1000baseKX/Full                                                                                                                                                                          
                                10000baseKR/Full                                                                                                                                                                         
                                15000baseKR/Full

我目前也使用了下面的内容。

代码语言:javascript
复制
link_mode_expected=15000baseKR

# get the mode using the shell command and parse the value needed
mode_supported=`ethtool ${eth_device} | sed -ne '/Supported link modes:/,/:/p' |\
sed  -e 's/^[[:space:]]*//'  -e 's/[[:space:]]*$//' | grep "$link_mode_expected"`
mode_advertised=`ethtool ${eth_device} | sed -ne '/Advertised link modes:/,/:/p' |\
sed -e 's/^[[:space:]]*//'  -e 's/[[:space:]]*$//' | grep "$link_mode_expected"`

if [ "$mode_supported" != "$link_mode_expected" ] ||\
    ( [ "$mode_supported" != "$mode_advertised" ] ) ; then
        
     #some action
fi

上面的代码给出了正确的结果,对于mode_advertisedmode_supported都是15000 above /Full,我正在执行上面的逻辑,但是我正在寻找下面的帮助

如何避免两个execution?

  • Is命令,我们能从这个缓冲区将输出添加到缓冲区和grep中吗?

  • ,什么是相同的awk,如果awk在中更快,那么有比上面的方法更好的方法吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-24 09:14:30

Awk确实是你所有问题的答案。

代码语言:javascript
复制
link_mode_expected=15000

if ethtool "$eth_device" |
   awk -v lme="$link_mode_expected" '
      s && /:/ { s=0 }
      /Supported link modes:/ { s=1 }
      s && ($NF + 0 == lme) { sgood++ }
      a && /:/ { a=0 }
      /Advertised link modes:/ { a=1 }
      a && ($NF + 0 == lme) { agood++ }
      END { exit 1-(agood && sgood) }'
then
    # some action
fi

演示,带有一些调试打印:https://ideone.com/v5du8g

让Awk执行比较并将其退出状态设置为if检查在Awk端有点笨重,但使脚本在周围的shell脚本中使用非常容易和自然。

sed类似,Awk每次迭代处理一行(或者更具体地说,只处理一条记录)。在此脚本中,简单变量sa分别反映当前输入行是否位于枚举受支持模式或公告模式的区域内。如果我们在这样一个区域,我们检查行上的最后一个字段($NF)是否数值(+ 0)为lme中的数字。Awk很方便地忽略了此场景中值上的任何非数值尾。最后,我们将退出状态设置为0表示成功(找到了两个值),或者设置为1,根据shell的约定(零退出代码意味着成功,其他任何事情都是失败的)。

作为另一种方法,您可以尝试找出要拆分的记录分隔符(RS),而不是换行符。在冒号上拆分可能很好,因为这样您就可以一次检查整个区域(但这样就失去了NF包含要检查的字段的索引的简单而优雅的特性,因此最终可能不会更简单)。

您还可以选择简单地让Awk提取并打印值,然后在shell中进行比较;但是,让shell解析您刚才花了那么多时间解析的来自Awk的输出是生硬的,没有吸引力。

这个脚本并不是完全琐碎的,但是您应该发现,学习足够多的Awk来编写更简单的脚本是非常愉快和快速的,并且非常值得您花时间。你已经可以在30分钟到一个小时的预算下走得很远了。

需要自定义解析器的即席输出格式一直是挫折感和摩擦的根源。越来越多的现代工具可以选择以机器可读的标准格式(如JSON、YAML或XML )来生成输出。唉,不幸的是,ethtool似乎没有任何这样的设施。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74177934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档