Como remover o elemento da lista?

3

Eu escrevi um comando que gera uma lista de nomes de host, por exemplo, :

clab148node11
clab148node12
clab148node15
clab148node16

Agora, gostaria de remover os nós que não respondem ao ping. Por enquanto eu tenho algo assim:

for node in $nodes
do
         result=$(ping -c 1 $node; echo $?)
done

Agora, como removo nós que possuem $result diferente de 0?

    
por Patryk 05.02.2013 / 11:18

3 respostas

4

Prefiro criar uma nova lista e substituir uma antiga por uma nova:

nodes="127.0.0.1 1.2.3.4 1.2.3.4 "
nodes_out=
for node in $nodes
do 
    ping -c 1 $node >/dev/null 2>&1 && nodes_out+=$node
done
nodes=$nodes_out
    
por 05.02.2013 / 12:39
2

como @manatwork disse, parece mais simples e seguro construir uma nova lista com os nós válidos.

No entanto, como "$ nodes" é avaliado antes da primeira iteração do loop for, deve ser possível alterá-lo durante o mesmo loop:

$ nodes="127.0.0.1 1.2.3.4 1.2.3.4 "
$ for node in $nodes; do
      result=$(ping -c 1 $node >/dev/null 2>/dev/null; echo $?);
      if [ "$result" -ne 0 ]; 
      then    nodes=$(echo $nodes | sed -e "s/ *$node */ /"); 
      fi;
      echo result=$result node=$node nodes=$nodes ;    
  done ;

Aviso: meu sed substituir [space]$node[space] ou $node[space] ou [space]$node para funcionar em todos os casos, dependendo da posição de $node na lista $nodes (se estiver no meio, ou no primeiro ou no último elemento, espaço (s) antes e depois de estar presente ou não). E só substitui 1 ocorrência por vez, mas você pode adicionar um% final/g para se livrar de todas as ocorrências de uma só vez.

Esta saída:

result=0 node=127.0.0.1 nodes=127.0.0.1 1.2.3.4 1.2.3.4
result=1 node=1.2.3.4 nodes=127.0.0.1 1.2.3.4
result=1 node=1.2.3.4 nodes=127.0.0.1
    
por 05.02.2013 / 11:53
0

Outra opção é simplesmente usar um grep inverso para encontrar todas as ocorrências na lista não correspondentes ao host:

for node in $nodes
do
    if ! 'ping -c 1 $node > /dev/null 2>&1'; then 
        nodes="'echo \"$nodes\" | grep -v \"$node\"'"
    fi
done
    
por 08.07.2016 / 08:26