Если у меня есть список в Bash
L="11 22 11 33 22 44"
Есть ли чистый способ добраться до "11 22 33 44"?
В одну сторону:
$ L="11 22 11 33 22 44"
$ L=$(echo $L | tr ' ' '\n' | sort -nu)
$ echo $L
11 22 33 44
Используя tr, числа разбиваются на отдельные строки, а сортировка используется для сортировки чисел (-n) и удаления дубликатов (-u).
Обычный шаблон в некоторых других языках программирования - хранить каждое значение как «ключ» в хеш-коде, словаре или ассоциативном массиве и полагаться на реализацию, чтобы сохранить хеш-ключи уникальными.
declare -A items=()
for item in $L; do
items[$item]=1
done
L=${!items[*]}
(К сожалению, реализация bash
примерно в 2 раза медленнее, чем sort -u
.)
Еще один полезный для проверки списка уникальных IP-адресов, подключаемых к вашим серверам, с помощью команды netstat:
Пример вывода Netstat
tcp 0 0 192.168.1.196:8009 192.168.21.124:45921 TIME_WAIT
tcp 0 0 192.168.7.196:8009 192.168.21.124:51579 УСТАНОВЛЕНО
tcp 0 0 192.168.7.196:8009 192.168.20.12:20213 TIME_WAIT
Пример команды
В этом примере я начинаю с фильтрации порта TCP, вырезания локальной информации, сортировки списка, а затем передачи его по команде «uniq».
netstat -an | grep ":8009" | cut -d "" -f 28 | cut -d ":" -f 1 | сортировать -у
Я получаю список из 2 уникальных внешних IP-адресов, подключенных к моей системе.
192.168.21.124
192.168.21.12
Если вы сделали какой-то необычный материал для мониторинга, вы можете составить график общего количества подключенных уникальных узлов, сравнить список с белым списком разрешенных IP-адресов, добавить неавторизованные IP-адреса в черный список и т.д.
Продолжая ответ Гуру выше, если у вас есть массив, вы можете:
$ L=(11 22 11 33 22 44)
$ echo ${L[@]}
11 22 11 33 22 44
$ L=($(echo ${L[@]} | tr ' ' '\n' | sort -nu))
$ echo ${L[@]}
11 22 33 44