Como faço para pegar uma lista e removê-la de um arquivo?

10

Eu tenho uma longa lista de nomes de domínio que preciso remover do / etc / remotedomains. Eles provavelmente não estão em nenhuma ordem específica no arquivo. Cada domínio está em uma linha.

Como eu poderia percorrer a lista e encontrar essa linha em domínios remotos e removê-la.

xenoterracida
fonte

Respostas:

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

O -vcomando grep informa apenas as linhas de saída que não correspondem ao padrão.

O -f listcomando grep lê os padrões do arquivo list.

O -Fcomando grep diz para interpretar os padrões como strings simples, não como expressões regulares (para que você não tenha problemas com os meta-caracteres regex).

O -xcomando grep diz para coincidir com a linha inteira, por exemplo, se houver um padrão fooque apenas remova a linha foo, não a linha foobarou barfoo.

sepp2k
fonte
3
nota: lembre-se sempre de fazer backup /etc/localdomainse /etc/remotedomainsantes de fazer coisas assim.
Xenoterracide
3
-Fé para correspondência de cadeia fixa ("correspondências exatas"), mas não força o padrão a corresponder à linha inteira. POSIX especifica o -xsinalizador para limitar as correspondências às instâncias em que um padrão corresponde à linha inteira.
precisa
@ Chris: Bah, boa captura.
sepp2k
1

Use comm!

comm -23 /etc/remotedomains remove

Na página do manual:

Compare os arquivos classificados FILE1 e FILE2 linha por linha.

Sem opções, produza saída de três colunas. A coluna um contém linhas exclusivas para FILE1, a coluna dois contém linhas exclusivas para FILE2 e a coluna três contém linhas comuns aos dois arquivos.

As opções -1, -2 e -3 desabilitam as respectivas colunas.

No entanto, exige que os arquivos sejam classificados.

jgr
fonte
0

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

Se sua lista de domínios a excluir estiver em um arquivo, então:

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

Notas:

  1. Use -i.bak para que o sed faça um backup do domainlist.txt

  2. Se removelist.txt tiver muitos milhares de entradas, poderá exceder o comprimento máximo da linha de comando. Este não é um cenário muito provável, mas algo que você deve estar ciente.

Em uma reflexão mais aprofundada, esse risco pode ser eliminado com:

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