从可变输出中获取特定线

时间:2015-11-17 17:06:57

标签: linux string bash shell sed

我需要从分配给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收到的数据包结果的数字值,除了“收到的数据包”部分。我试过做一些正则表达式。然后发现这个 sed 看起来很有前途,但我不知道如何使用它,就正则表达式而言。我很确定我需要用正则表达式来完成它。

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

2 个答案:

答案 0 :(得分:1)

只需添加:

auto t = new std::thread(&AsyncClass::method1, this);

它将打印您从命令的RAW输出中保存的内容。 PACKETS_RECEIVED=$(echo "${UDP_RAW_VALUE}" | sed -n 's/^ *\([0-9][0-9]*\) packets received$/\1/p') 很重要,或者它会将所有输出打印在一行中,这不是你想要的。

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

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

答案 1 :(得分:1)

如果你不介意的话,也许还有另一种解决方案吗?

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

/Udp:/ #find所有拥有Udp的行

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

p #print

或awk

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