Fórum Root.cz

Hlavní témata => Server => Téma založeno: pokus 14. 11. 2013, 11:01:59

Název: Provnávání seznamů IP adres
Přispěvatel: pokus 14. 11. 2013, 11:01:59
Ahoj,

Snažím se udělat skript, který by porovnával dva seznamy IP adres a vypsal všechny ip adres které jsou v druhém seznamu ale nejsou v prvním seznamu. Seznamy jsou dva textové soubory s ipadresami podsebou...
Vymyslel jsem něco takového.

Kód: [Vybrat]
#!/bin/bash

for i in $(cat ip2.txt)
do
if [ -z 'cat ip1.txt | grep $i' ]; then
echo $i
fi;
done
exit 0

Můžete mi prosím poradit kde dělám chybu?
Název: Re:Prorovnávání seznamů ip adres
Přispěvatel: pokus 14. 11. 2013, 11:08:19
Už jsem na to přišel sdiff file.txt file2.txt
Název: Re:Prorovnávání seznamů ip adres
Přispěvatel: PetrV 14. 11. 2013, 12:24:02
if [ $(cat ip1.txt | grep $i | wc -l) -lt 1 ];
Název: Re:Prorovnávání seznamů ip adres
Přispěvatel: DgBd 14. 11. 2013, 15:03:27
A cenu za zbytečné použití příkazu cat získávají oba pacienti zdejšího ústavu.
Název: Re:Prorovnávání seznamů ip adres
Přispěvatel: PetrV 14. 11. 2013, 16:49:53
A cenu za zbytečné použití příkazu cat získávají oba pacienti zdejšího ústavu.

čím více cat, tím více unix. To je slyšet na každý vietnamský tržnici.
Název: Re:Provnávání seznamů IP adres
Přispěvatel: alfi 15. 11. 2013, 09:14:05
nedávno jsem řešil něco podobného a objevil v debian balíčcích grepcidr (neuvěřitelné, jaké všechny nástroje se tam dají najít). podle popisu nejspíš můžou být první seznam i jen IP adresy místo rozsahů, ale doplnit všude "/32" na konec by taky šlo :-)
Kód: [Vybrat]
grepcidr can be used to filter a list of IP addresses against  one  or  more  Classless  Inter-Domain  Routing
(CIDR) specifications, or arbitrary networks specified by an address range.
Kód: [Vybrat]
echo -e "192.168.1.1\n192.168.1.2" | grepcidr "192.168.1.2"
192.168.1.2
Název: Re:Provnávání seznamů IP adres
Přispěvatel: Ogar 15. 11. 2013, 14:42:16
A co na to jit trosku sofistikovaneji, elegantneji a s mensi slozitosti nez n2, treba 2*log2n?

Kód: [Vybrat]
sort ip1.txt ip2.txt | uniq -d >ip_tmp.txt
sort ip2.txt ip_tmp.txt | uniq -u >ip_diff.txt

Prvni radek: 'sort' prikaz spoji oba seznamy dohromady, setridi, a prikaz 'uniq -d' vypise pouze duplicitni radky.
Druhy radek: 'sort' opet dela to same, ale 'uniq -u' vypise pouze unikatni radky.

Ted je jenom otazka, jak velke jsou obe mnoziny a jak velky je jejich prunik a rozdil, protoze pri jednom pomeru je vhodnejsi posloupnost 'uniq -d' a 'uniq -u', pri jinem 'uniq -u' a az pak 'uniq -d'. Ale to uz je na analyze konkretni situace ...

P.S. 'sort' tridi metodou qsort, proto ta slozitost log2n