grep несколько шаблонов с использованием файла шаблона - PullRequest
0 голосов
/ 22 октября 2018

Я скачал очень огромный список хостов для блокировки рекламы.Проблема в том, что некоторые сайты нарушают свою функциональность, например форум / обсуждение и / или картинки.Поэтому я хочу удалить некоторые сайты в файле hosts.

Допустим, я хочу удалить a.com и b.com с хостов.Эти методы работают.

grep -ve a.com -e b.com hosts > new_hosts

или

egrep -v 'a.com|b.com' hosts > new_hosts

Оба работают нормально.Но если шаблон увеличивается, я хочу записать шаблон в файл.Если я использую это

grep -vf pattern.txt hosts > new_hosts

Только последний шаблон будет удален.Если pattern.txt содержит

a.com
b.com

Только b.com опущено в new_hosts, a.com все еще записано в new_hosts.Так какую команду grep использовать с использованием файла шаблона?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Спасибо за отзывы, ребята.Поскольку большинство из вас подозревает ошибку из pattern.txt , то я подозреваю, что это может быть блокнот Windows, который допустил ошибку.Новая строка в блокноте Windows заканчивается 0D 0A (в шестнадцатеричном формате).

Я где-то читал, что новая строка для grep должна быть 0A (в шестнадцатеричном).После редактирования файла pattern.txt с использованием Notepad ++ эта команда, наконец, работает: -)

grep -vf pattern.txt hosts > new_hosts

Или, может быть, это лучше

fgrep -vf pattern.txt hosts > new_hosts

Оба работают отлично:-)

0 голосов
/ 22 октября 2018

Если у вас есть файл hosts, который вы хотите сравнить с другим файлом, содержащим записи, которые вы хотите удалить, с uniq это будет проще, чем с grep.

Просто объедините файлы и запустите что-то вроде этого:

cat hosts badfile badfile | sort | uniq -u > new_hosts

Badfile добавляется дважды, потому что, если запись еще не присутствует в хостах, она останется.Дублирование гарантирует, что все копии будут удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...