¿Cómo tomo una lista y la elimino de un archivo?

10

Tengo una larga lista de nombres de dominio que necesito eliminar de / etc / remotedomains. Probablemente no estén en ningún orden en particular en el archivo. Cada dominio está en una línea.

¿Cómo podría recorrer la lista y encontrar esa línea en dominios remotos y eliminarla?

xenoterracida
fuente

Respuestas:

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

Le -vdice a grep que solo muestre líneas de salida que no coincidan con el patrón.

El -f listle dice a grep que lea los patrones del archivo list.

El -Fle dice a grep que interprete los patrones como cadenas simples, no como expresiones regulares (para que no tenga problemas con los meta-caracteres regex).

El -xle dice a grep que coincida con la línea completa, por ejemplo, si hay un patrón fooque solo debería eliminar la línea foo, no la línea foobaro barfoo.

sepp2k
fuente
3
nota: siempre recuerde hacer una copia de seguridad /etc/localdomainsy /etc/remotedomainsantes de hacer cosas como esta.
xenoterracide
3
-Fes para la coincidencia de cadena fija ("coincidencias exactas"), pero no obliga al patrón a coincidir con la línea completa. POSIX especifica la -xbandera para limitar las coincidencias a instancias donde un patrón coincide con la línea completa.
Chris Johnsen el
@ Chris: Bah, buena captura.
sepp2k
1

Use comm!

comm -23 /etc/remotedomains remove

Desde la página del manual:

Compare los archivos ordenados FILE1 y FILE2 línea por línea.

Sin opciones, produce una salida de tres columnas. La columna uno contiene líneas exclusivas de FILE1, la columna dos contiene líneas exclusivas de FILE2 y la columna tres contiene líneas comunes a ambos archivos.

Las opciones -1, -2 y -3 deshabilitan las columnas respectivas.

Sin embargo, requiere que los archivos estén ordenados.

jgr
fuente
0

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

Si su lista de dominios para eliminar está en un archivo, entonces:

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

Notas:

  1. Use -i.bak para que sed haga una copia de seguridad de domainlist.txt

  2. Si removelist.txt tiene muchos miles de entradas, podría desbordar la longitud máxima de la línea de comando. Este no es un escenario muy probable, pero es algo que debe tener en cuenta.

Si reflexionamos más, ese riesgo puede eliminarse con:

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
cas
fuente