Come posso prendere un elenco e rimuoverlo da un file?


10

Ho un lungo elenco di nomi di dominio che devo rimuovere da / etc / remotedomains. Probabilmente non sono in alcun ordine particolare nel file. Ogni dominio è su una riga.

Come potrei scorrere l'elenco e trovare quella linea in domini remoti e rimuoverla.

Risposte:


11
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains

La -vdice grep per linee di uscita solo che non corrispondono al modello.

La -f listdice grep di leggere i modelli dal file list.

La -Fdice grep di interpretare i modelli come stringhe semplici, non espressioni regolari (in modo da non incorrere in problemi con la meta-caratteri espressioni regolari).

La -xdice grep per abbinare l'intera linea, ad esempio, se c'è un modello fooche dovrebbe rimuovere solo la linea foo, non la linea foobaro barfoo.


3
nota: ricordati sempre di fare il backup /etc/localdomainse /etc/remotedomainsprima di fare cose come questa.
xenoterracide,

3
-Fè per la corrispondenza stringa fissa ( “corrispondenze esatte”), ma non senza forzare il modello per abbinare l'intera linea. POSIX specifica il -xflag per limitare le corrispondenze alle istanze in cui un modello corrisponde all'intera linea.
Chris Johnsen,

@ Chris: Bah, buona cattura.
sepp2k,

1

Usa comm!

comm -23 /etc/remotedomains remove

Dalla pagina man:

Confronta i file ordinati FILE1 e FILE2 riga per riga.

Senza opzioni, produce output a tre colonne. La colonna uno contiene righe univoche per FILE1, la colonna due contiene righe univoche per FILE2 e la colonna tre contiene righe comuni a entrambi i file.

Le opzioni -1, -2 e -3 disabilitano le rispettive colonne.

Tuttavia, richiede che i file vengano ordinati.


0

sed -r -i -e '/^(domain1|domain2|domain3|...|domainN)$/d' domainlist.txt

Se il tuo elenco di domini da eliminare si trova in un file, allora:

sed -r -i -e '/^'"$(xargs <removelist.txt|sed -e 's/ /|/g)"')$/d' domainlist.txt

Appunti:

  1. Utilizzare -i.bak per fare in modo che sed esegua un backup di domainlist.txt

  2. Se removelist.txt ha molte migliaia di voci, potrebbe superare la lunghezza massima della riga di comando. Questo non è uno scenario molto probabile ma qualcosa di cui dovresti essere consapevole.

Su ulteriore riflessione, tale rischio può essere eliminato con:

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.