【问题标题】:Get Specific Line From Variable Output从变量输出中获取特定行
【发布时间】:2015-11-17 17:06:57
【问题描述】:

我需要从分配给 bash 变量的命令输出中获取一行。

#Gets the netstat values for the UPD packages
UDP_RAW_VALUE=`netstat -su`

##TRYING THIS BUT TOTALLY FAILED.
echo "$UDP_RAW_VALUE" | sed -n "$2"p 

我只需要从其中一个命令执行中获取一个特定的值,即

UDP_RAW_VALUE=`netstat -su`

这个特定命令的输出是这样的:

-bash-4.2$ bash MyBashScript
IcmpMsg:
    InType0: 14464
    InType3: 12682
    InType8: 101
    InType11: 24
    OutType0: 101
    OutType3: 34385
    OutType8: 15840
Udp:
    931752 packets received
    889 packets to unknown port received.
    0 packet receive errors
    1007042 packets sent
    0 receive buffer errors
    0 send buffer errors
    IgnoredMulti: 647095
UdpLite:
IpExt:
    InMcastPkts: 1028470
    InBcastPkts: 552859
    InOctets: 233485843587
    OutOctets: 75548840236
    InMcastOctets: 44792084
    InBcastOctets: 167490770
    InNoECTPkts: 317265390
    InECT0Pkts: 25289
    InCEPkts: 686361

简单地说,我需要读取 931752 个收到的数据包 结果的 numeric 值,不包括“收到的数据包” 部分。我试过做一些正则表达式。然后发现这个 sed 看起来很有希望,但我不知道如何使用它,就正则表达式而言。我很确定我需要用正则表达式来完成。

我需要数值,因为我将比较先前值和当前值并检查差异是否在阈值之间。如果没有,请发送邮件。

【问题讨论】:

  • 顺便说一句,为您自己的变量名称使用全大写名称是不好的形式。请参阅pubs.opengroup.org/onlinepubs/009695399/basedefs/… 的 POSIX 规范的第四段,记住环境变量和 shell 变量共享一个命名空间。
  • ("IEEE Std 1003.1-2001 的 Shell and Utilities 卷中的实用程序使用的环境变量名称仅由大写字母、数字和 '_'(下划线)中定义的字符组成可移植字符集,不以数字开头。[...] 包含小写字母的环境变量名称的名称空间是为应用程序保留的。 应用程序可以使用来自该名称空间的名称定义任何环境变量无需修改标准实用程序的行为。”)
  • @CharlesDuffy 感谢提供信息的伙伴会注意!

标签: linux string bash shell sed


【解决方案1】:

只需添加这个:

 PACKETS_RECEIVED=$(echo "${UDP_RAW_VALUE}" | sed -n 's/^ *\([0-9][0-9]*\) packets received$/\1/p')

它将打印您从命令的 RAW 输出中保存的内容。 "" 很重要,否则它将在一行中打印所有输出,这不是您想要的。

sed 命令 -n 表示默认情况下不打印行。 s///p 命令告诉是用\1 替换前两个/ / 之间的模式,这是模式中\( 和\) 之间的组;在我们的例子中,这将是您想要的数字。

PACKET_RECEIVED=$() 部分告诉 bash 运行 $() 之间的内容并将输出分配给变量。

【讨论】:

  • 你是圣人!我实际上理解了你的解释!谢谢小伙伴的帮助!将在 3 分钟内接受它作为答案:)
  • 我很高兴它对您有所帮助.. 更重要的是很高兴您了解它在做什么。 :) Sed 和 awk 是很棒的工具,但它们确实需要一些时间来适应。
【解决方案2】:

如果您不介意的话,也许是另一种 sed 解决方案?

UDP_RAW_VALUE=`netstat -su|sed -n '/Udp/{n;s/[^0-9\n]//g;p}'`

/Udp:/ #查找所有有Udp的行

n # 获取下一行 删除所有留下你号码的字符

p#print

或 awk

   UDP_RAW_VALUE=`netstat -su|awk '$0~/Udp:/{getline;print $1}'`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 2019-04-14
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2021-03-05
    • 2021-05-08
    • 1970-01-01
    相关资源
    最近更新 更多