如何精确返回bash脚本的输出值有命令



我有以下命令:

$ snmpnetstat -v2c -c public -Cs -Cp udp 10.10.0.32 

具有终端输出:

udp:
198 total datagrams received
65 datagrams to invalid port
0 datagrams dropped due to errors
265 output datagram requests

我想编写一个返回以下内容的 bash 脚本:

Bash脚本的所需输出:

Received Datagrams: 198 
Invalid port:65 
Dropped datagrams: 0 
Datagram requests: 256

我从:

#!/bin/bash
rs="$(snmpnetstat -v2c -c public -Cs -Cp udp 10.10.0.32)"
ReceivedDatagrams=$(echo $rs | cut -d"/" -f1)
InvalidPort=$(echo $rs | cut -d"/" -f2)
DroppedDatagrams=$(echo $rs | cut -d"/" -f3)
DatagramRequests=$(echo $rs | cut -d"/" -f4)
echo "Received Datagrams:$ReceivedDatagrams Invalid port:$InvalidPort Dropped datagrams:$DroppedDatagrams Datagram requests:$DatagramRequests"

输出为:

zsz@bme-ib112-05:~/bash_scripts$ ./script.sh         
Received Datagrams:udp: 242 total datagrams received 37 datagrams to invalid port 0 datagrams dropped due to errors 638 output datagram requests Invalid port:udp: 242 total datagrams received 37 datagrams to invalid port 0 datagrams dropped due to errors 638 output datagram requests Dropped datagrams:udp: 242 total datagrams received 37 datagrams to invalid port 0 datagrams dropped due to errors 638 output datagram requests Datagram requests:udp: 242 total datagrams received 37 datagrams to invalid port 0 datagrams dropped due to errors 638 output datagram requests

输出值一遍又一遍地重复,而不是我想要的。

一个简单的awk解决方案,正如shellter所指出的,它消除了所有这些额外进程的开销:

$ cat udp.out
udp:
198 total datagrams received
65 datagrams to invalid port
0 datagrams dropped due to errors
265 output datagram requests
$ awk '
/received/ {printf "Received Datagrams: %sn", $1}
/invalid/  {printf "Invalid port: %sn"      , $1}
/dropped/  {printf "Dropped datagrams: %sn" , $1}
/requests/ {printf "Datagram requests: %sn" , $1}
' udp.out
Received Datagrams: 198
Invalid port: 65
Dropped datagrams: 0
Datagram requests: 265

如果您并不真正希望将值分配给变量,并且严格希望重新格式化输出,则可以使用 awk 进行更干净的代码,如下所示:

awk '
/total datagrams/                 { print "Received Datagrams:", $1 }
/datagrams to invalid port/       { print "Invalid port:", $1 }
/datagrams dropped due to errors/ { print "Dropped datagrams:", $1 }
/output datagram requests/        { print "Datagram requests:", $1 } 
' 

从某种意义上说,awk正在为您完成所有解析并挤出(tr -s)所有空格。 我相信它使代码更易于阅读。

我无法重新创建snmpnetstat命令的确切输出,所以我只是将您的终端输出复制/粘贴到文件tmp中。

以下脚本使用您的逻辑完成您请求的工作

我建议接受shellter和Ed Morton的建议,并研究引用变量如何工作以禁止空白/换行符的扩展,并使用Awk获得更强大且易于扩展的解决方案。

#!/bin/bash
rs="$(cat tmp)"
# You have to quote "$rs" so newlines don't break
ReceivedDatagrams="$(echo "$rs" | cut -d$'n' -f2 | tr -s ' '| cut -d' ' -f2)"
InvalidPort="$(echo "$rs" | cut -d$'n' -f3 | tr -s ' '| cut -d' ' -f2)"
DroppedDatagrams="$(echo "$rs" | cut -d$'n' -f4 | tr -s ' '| cut -d' ' -f2)"
DatagramRequests="$(echo "$rs" | cut -d$'n' -f5 | tr -s ' '| cut -d' ' -f2)"
echo "Received Datagrams:$ReceivedDatagrams"
echo "Invalid port:$InvalidPort"
echo "Dropped datagrams:$DroppedDatagrams"
echo "Datagram requests:$DatagramRequests"

最新更新