У меня есть следующая команда:
$ 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
...