Назад | Перейти на главную страницу

Написание точных значений вывода сценария 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, который возвращает следующее:

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

Я начал с:

#!/bin/bash

#!/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"



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

Выходные значения повторяются снова и снова, а не так, как я хотел.

Есть пара проблем с вашим скриптом. Первый, echo проглатывает все символы новой строки, если вы не укажете -e переключатель. Итак, после этого:

rs=$(snmpnetstat -v2c -c public -Cs -Cp udp 10.10.0.32)
echo $rs

вывод будет:

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

Во-вторых, вы указали / как разделитель для cut, но вывод не содержит этого символа, поэтому использовать его в качестве разделителя бесполезно.

В-третьих, вы хотели вырезать определенные поля из вывода, но это не сработает, в основном из-за первого пункта. Было echo не проглотил символы новой строки, это может сработать, но вам нужно будет вырезать только первое поле, так как для каждой строки это поле будет содержать нужное вам число. Но тогда вам все равно нужно преобразовать полученные строки в массив и использовать этот массив для вывода того, что вам нужно.

Как это:

output=$(snmpnetstat -v2c -c public -Cs -Cp udp 10.10.0.32)
thearray=($(echo -e "$output"|tail -n +2|awk '{print $1}'))
echo "Received Datagrams:${thearray[0]} Invalid port:${thearray[1]} Dropped datagrams: ${thearray[2]} Datagram requests: ${thearray[3]}"

Может что-то вроде этого

#!/bin/bash
rs=$(snmpnetstat -v2c -c public -Cs -Cp udp 10.10.0.32)
# Create an array with one numberset per entry
num=($(grep -o "[0-9]*" file.txt))
# text output using the values within the array
echo "Received Datagrams:${num[0]} ReceivedDatagrams Invalid port:${num[1]} Dropped datagrams: ${num[2]} Datagram requests:${num[3]}"

bash не допускает пробелов вокруг = для задания:

rs=$(snmpnetstat -v2c -c public -Cs -Cp udp 10.10.0.32)

В конце концов, bash еще более требователен к своим пробелам, чем python...