Como posso obter os itens exclusivos em uma lista de bash?

2

Se eu tiver uma lista no bash

L="11 22 11 33 22 44"

Existe uma maneira limpa de acessar "11 22 33 44"?

    
por Travis Bear 01.12.2012 / 02:24

4 respostas

6

Um caminho:

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

Usando tr, os números são divididos em linhas individuais e a classificação é usada para classificar os números (-n) e remover os duplicados (-u).

    
por 01.12.2012 / 02:37
4

Um padrão comum em algumas outras linguagens de programação é armazenar cada valor como uma 'chave' em um hash ou dicionário ou matriz associativa, e contar com a implementação para manter as chaves hash únicas.

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

(Infelizmente, a implementação de bash é cerca de 2 × mais lenta que sort -u .)

    
por 01.12.2012 / 02:45
1

Outro que eu achei útil para verificar a lista de IPs únicos que se conectam a seus servidores, a partir do comando 'netstat' é este:

Exemplo de saída do 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 ESTABELECIDO
tcp 0 0 192.168.7.196:8009 192.168.20.12:20213 TIME_WAIT

Exemplo de comando

Neste exemplo, estou começando filtrando a porta TCP, cortando as informações locais, classificando a lista e, em seguida, canalizando-a para o comando 'uniq'.

netstat -an | grep ": 8009" | corte -d "" -f 28 | cut -d ":" -f 1 | sort -u

O que eu obtenho é uma lista dos 2 endereços IP externos exclusivos que se conectam ao meu sistema.

192.168.21.124
192.168.21.12

Se você fez alguma coisa sofisticada de monitoramento, você pode representar graficamente o número total de nós únicos conectados, comparar a lista com sua lista branca de IPs permitidos, adicionar IPs não autorizados à sua lista negra, etc.

    
por 20.08.2015 / 01:12
0

Estendendo a resposta do Gurus acima, se você tiver uma matriz, pode:

$ 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
    
por 30.12.2014 / 07:56

Tags