Comparação de dois valores da lista dois

1

Estou tentando comparar duas strings. Um valor é proveniente de iptables e o outro é de um arquivo onde salvei registros anteriores.

Eu quero identificar se um novo usuário aparece no iptables. Em caso afirmativo, adicionarei esse registro ao meu arquivo.

Aqui o que eu tentei até agora.

chain=$(/usr/sbin/iptables -vnL | grep "references" | awk '{print $2}')

file=/data/..../2011-11.txt


for i in $chain
do
         while IFS=',' read -r f1 f2 f3 f4 f5
         do
              user=$f1

              if [ $i == "$user" ]; then
                  echo "user matched $user"
              elif [ $i != $user ]; then      #a new user
                  echo "new user $i"
                  break
              fi   #user matching if     

         done < "$file"

done    #reading data from the file for loop

Meu iptables parece com (cadeia)

NalindaChainksSdt
KasunikaChainyCehf
KivinduChainmzWeN
KumudikaChainsXcAp
LocalServerChainRyqvv

Os valores dos arquivos são (arquivo)

NalindaChainksSdt
KasunikaChainyCehf

Aqui, o script deve ignorar os nomes NalindaChainksSdt e KasunikaChainyCehf das cadeias. (usuário correspondido)

Mas isso não funciona. Apenas identifica todos os usuários no arquivo como novos usuários.

O que estou perdendo aqui?

    
por Sachith 10.11.2017 / 07:19

2 respostas

2

Em primeiro lugar, nunca faz sentido dizer

if condition; then
    do something
elif condition is false; then
    do something different
fi

Porque, se condition não for verdadeiro, você sabe que é falso. Você pode apenas dizer

if condition; then
    do something
else
    do something different
fi

Agora pense na lógica do seu script. É um algoritmo n 2 - ou, para ser mais preciso, se $chain for m palavras longas, e o arquivo for n linhas longas, então o código pode potencialmente fazer loop em m × n vezes. Agora pense no que isso significa para o seu problema:

Você está dizendo que $i é um novo usuário se você encontrar qualquer usuário ( $user ) no arquivo diferente. Mas $i é apenas um novo usuário if todos os usuários no arquivo é diferente de $i .

    
por 10.11.2017 / 07:50
1

Eu posso oferecer a solução mais simples com comm util:

#!/bin/bash

/usr/sbin/iptables -vnL | grep "references" | awk '{print $2}' > /tmp/chain

chain="/tmp/chain"
file="full path to 2011-11.txt"

comm -13 "$file" "$chain"

Se 2011-11.txt contiver:

NalindaChainksSdt
KasunikaChainyCehf

E chain contém:

NalindaChainksSdt
KasunikaChainyCehf
KivinduChainmzWeN
KumudikaChainsXcAp
LocalServerChainRyqvv

A saída será :

KivinduChainmzWeN
KumudikaChainsXcAp
LocalServerChainRyqvv
    
por 10.11.2017 / 08:27