PDA

View Full Version : [script] cerca e cancella riga


Daniele Rossi
06-11-2008, 13:34
Ciao,

ho un file HOSTS contenente centinaia di indirizzi web sotto forma numerica [xxx.xxx.xxx.xxx] e con [nomeesempio.com]

molti di questi indirizzi sono identici, fatta eccezione per la parte iniziale.
es: 1.nomeesempio.com, 2.nomeesempio.com, 3.nomeesempio.com, ecc...

vorrei realizzare uno script o comunque sfruttare uno script di qualche programma già esistente (OpenOffice?) per rimuovere tutti i simili e mantenere solo la radice.
Dell'indirizzo sopra vorrei solo nomeesempio.com, cancellando le righe superflue, ma non riesco a trovare lo script o la stringa di codice da usare per farlo.


Se qualcuno può darmi lumi, grazie :)

john_revelator
06-11-2008, 15:59
Usando la powershell dovrebbe essere abbastanza agevole. Se mi spieghi un pò più nel dettaglio cosa vuoi fare provo a darti una mano.
Immagino che il file hosts contenga anche altre righe che non devi toccare. Penso che la cosa più pratica sia ciclare il file riga per riga tramite il cmd-let get-content e lavorarci così.

Ti consiglio intanto di scaricarti la powershell da qui
http://www.microsoft.com/windowsserver2003/technologies/management/powershell/download.mspx

scegliendo quella relativa al tuo sistema operativo. Nel caso non lo abbia già scarica pure il framework .NET in quanto è richiesto.

Una volta installata la puoi richiamare da esegui digitando powershell.
Quando hai concluso l'installazione spiegami nel dettaglio come dev'essere il nuovo file e cerchiamo di risolvere. :)

edit. Giusto per darti un'idea della flessibilità di powershell.
Come faresti col classico prompt dei comandi raggiungi la cartella contenente il tuo file hosts e digita questo comando (oppure fai copia incolla

gc hosts | ? {$_ -notmatch "nomeesempio.com"} | out-file nuovo.txt

questa riga esaminerà il contenuto del tuo file ed estrarrà solo le righe che non contengono la stringa nomeesempio.com.
Una volta filtrate reindirizzerà l'output su un nuovo file di testo di nome nuovo.txt che verrà creato all'interno della stessa cartella.

Daniele Rossi
07-11-2008, 07:27
Fantastico! penso che questo tool sia esattamente quel che fa per me :)

Ora, venendo al problema, ho scritto:
gc hosts | ? {$_ -match "a8.net"} out-file nuovo.txt

dove
a8.net è uno dei molti siti listati con "doppioni" (es: test.a8.net, 1.a8.net, 2.a8.net, ecc...)

adesso stavo cercando di avere un file di testo contenente tutte le voci che includono a8.net, tanto per fare una prova.

Il risultato però è un errore che ti riporto:
Where-Object : Impossibile trovare un parametro corrispondente al nome 'out-file'.
In riga:1 car:13
+ gc hosts | ? <<<< {$_ -match "a8.net"} out-file nuovo.txt


Il mio scopo finale è quello di conservare solo i siti "radice" (quindi a8.net ma non test.a8.net, 1.a8.net, 2.a8.net, ecc...) così da avere un file HOSTS snello e performante.
La lista adesso comprende 616.620 byte, tagliando le righe non "radice" dovrei arrivare intorno ai 100.000 byte circa.


EDITO:
per ottimizzare:
mi occorre un comando che "rimuova" tutte le voci con più di 4 . (punti) sulla stessa riga.
Questo perché i siti listati sono del genere:

127.0.0.1 test.nomesito.com

e io voglio conservare solo la radice, ovvero:

127.0.0.1 nomesito.com

john_revelator
07-11-2008, 09:15
L'errore che ti viene restituito è dovuto al fatto che prima di out-file ti sei dimenticato di inserire la pipe (|).

Puoi anche limitarti a fare prima

gc hosts | ? {$_ -match "a8.net"}

così vedi le righe che corrispondono al criterio. Una volta appurato questo puoi reindirizzare l'output su file di testo.

Daniele Rossi
07-11-2008, 09:32
Funziona ma è un processo lentissimo, devo selezionare una riga "radice" per volta e poi trascrivere i risultati.

C'è un comando per rimuovere tutte le righe che presentano più "punti", come dicevo sopra?
Al momento non mi viene in mente un metodo più efficiente per procedere.

john_revelator
07-11-2008, 09:44
Funziona ma è un processo lentissimo, devo selezionare una riga "radice" per volta e poi trascrivere i risultati.

C'è un comando per rimuovere tutte le righe che presentano più "punti", come dicevo sopra?
Al momento non mi viene in mente un metodo più efficiente per procedere.

E' normale che impieghi del tempo vista la mole di dati.
Per quanto riguarda la tua domanda ci devo pensare. Adesso sono a lavoro. Stasera con calma vedo se riesco a trovare una soluzione. :)

john_revelator
07-11-2008, 14:48
Con questo comando ti verranno restituite tutte le righe del file host che contengono al massimo 4 punti


gc hosts | where { @([regex]::matches($_,"\.")).length -le 4}


Per reindirizzare l'output non farai altro che usare il cmdlet out-file.


gc hosts | where { @([regex]::matches($_,"\.")).length -le 4} | out-file nuovo.txt

Daniele Rossi
07-11-2008, 16:00
john grazie, seriamente :)
era 1 mese che impazzivo tra siti di script e manuali pdf di openoffice senza cavarne nulla di utile.

la dimensione attuale è di 151.654 byte.
Un bel risultato direi ;)

john_revelator
07-11-2008, 19:25
john grazie, seriamente :)
era 1 mese che impazzivo tra siti di script e manuali pdf di openoffice senza cavarne nulla di utile.

la dimensione attuale è di 151.654 byte.
Un bel risultato direi ;)

La powershell è utilissima. Prego. :)