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ć.
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:
grep -Fxf list -v /etc/remotedomains > remotedomains.new
mv remotedomains.new /etc/remotedomains
Polecenie -v
grep wyświetla tylko te wiersze, które nie pasują do wzorca.
-f list
Mówi grep czytać wzorce z pliku list
.
Polecenie -F
grep interpretuje wzorce jako zwykłe ciągi, a nie wyrażenia regularne (abyś nie miał problemów z metaznakami regularnymi).
-x
Mó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ę foobar
lub barfoo
.
-F
służy do stałego dopasowywania ciągów („dokładne dopasowania”), ale nie wymusza dopasowania wzoru do całej linii. POSIX określa -x
flagę, aby ograniczyć dopasowania do instancji, w których wzorzec pasuje do całej linii.
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.
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:
Użyj -i.bak, aby wykonać kopię zapasową pliku domainlist.txt
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
/etc/localdomains
i/etc/remotedomains
przed wykonaniem takich czynności.