2

Если у меня есть список в Bash

L="11 22 11 33 22 44"

Есть ли чистый способ добраться до "11 22 33 44"?

4 ответа4

6

В одну сторону:

$ L="11 22 11 33 22 44"
$ L=$(echo $L | tr ' ' '\n' | sort -nu)    
$ echo $L
11 22 33 44

Используя tr, числа разбиваются на отдельные строки, а сортировка используется для сортировки чисел (-n) и удаления дубликатов (-u).

4

Обычный шаблон в некоторых других языках программирования - хранить каждое значение как «ключ» в хеш-коде, словаре или ассоциативном массиве и полагаться на реализацию, чтобы сохранить хеш-ключи уникальными.

declare -A items=()
for item in $L; do
    items[$item]=1
done
L=${!items[*]}

(К сожалению, реализация bash примерно в 2 раза медленнее, чем sort -u .)

1

Еще один полезный для проверки списка уникальных 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-адреса в черный список и т.д.

0

Продолжая ответ Гуру выше, если у вас есть массив, вы можете:

$ 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .