Jak pobrać listę i usunąć ją z pliku?


10

Mam długą listę nazw domen, które muszę usunąć z / etc / remotedomains. Prawdopodobnie nie ma ich w określonej kolejności w pliku. Każda domena jest w jednej linii.

Jak mogę iterować listę i znajdować tę linię w domenach zdalnych i ją usuwać.

Odpowiedzi:


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

Polecenie -vgrep wyświetla tylko te wiersze, które nie pasują do wzorca.

-f listMówi grep czytać wzorce z pliku list.

Polecenie -Fgrep interpretuje wzorce jako zwykłe ciągi, a nie wyrażenia regularne (abyś nie miał problemów z metaznakami regularnymi).

-xMówi grep dopasować cały wiersz, na przykład, czy jest jakiś wzór foo, który należy usunąć tylko linię foo, a nie linię foobarlub barfoo.


3
Uwaga: zawsze pamiętaj o utworzeniu kopii zapasowej /etc/localdomainsi /etc/remotedomainsprzed wykonaniem takich czynności.
ksenoterrakid

3
-Fsłuży do stałego dopasowywania ciągów („dokładne dopasowania”), ale nie wymusza dopasowania wzoru do całej linii. POSIX określa -xflagę, aby ograniczyć dopasowania do instancji, w których wzorzec pasuje do całej linii.
Chris Johnsen,

@Chris: Bah, dobry połów.
sepp2k,

1

Użyj komunikatora!

comm -23 /etc/remotedomains remove

Ze strony podręcznika:

Porównaj posortowane pliki PLIK1 i PLIK2 linia po linii.

Bez opcji utwórz wynik trójkolumnowy. Kolumna pierwsza zawiera wiersze unikalne dla PLIKU1, kolumna druga zawiera wiersze unikalne dla PLIKU2, a kolumna trzecia zawiera wiersze wspólne dla obu plików.

Opcje -1, -2 i -3 wyłączają odpowiednie kolumny.

Wymaga to jednak sortowania plików.


0

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

Jeśli twoja lista domen do usunięcia znajduje się w pliku, to:

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

Uwagi:

  1. Użyj -i.bak, aby wykonać kopię zapasową pliku domainlist.txt

  2. Jeśli removeelist.txt ma wiele tysięcy wpisów, może to spowodować przekroczenie maksymalnej długości wiersza poleceń. To nie jest bardzo prawdopodobny scenariusz, ale powinieneś być tego świadomy.

Po dalszej refleksji ryzyko to można wyeliminować za pomocą:

for RE in $(xargs <removelist.txt|sed -e 's/ /|/g') ; \
  do sed -r -i -e '/^('"$RE"')$/d' domainlist.txt ; \
done
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.