Как получить файл с помощью параметров поиска из другого файла - PullRequest
10 голосов
/ 02 сентября 2010

Я пытаюсь использовать файл, содержащий IP-адреса, в качестве основы для поиска в файле конфигурации брандмауэра Cisco. Обычно я бы использовал что-то вроде:

for i in $(cat ip.file); do grep $i fw.config; done

Но это ничего не даст. Если я поместил приведенный выше скрипт в файл и выполнил его с флагами bash -xv, каждая строка возвращает что-то вроде этого:

+ for i in '`cat ip.file`'
+ grep $'1.2.3.4\r' fw.config  (each IP address is different)

grep 1.2.3.4 fw.config - это именно то, что я хочу, но я ничего не получаю от этой команды.

Мне известна опция grep -f, но она также ничего не возвращает. Я не опытный программист, поэтому я могу упускать из виду что-то очевидное.

Ответы [ 3 ]

22 голосов
/ 02 сентября 2010

Похоже, ip.file в формате DOS и имеет \r\n окончания строк. Запустите dos2unix, чтобы преобразовать в формат UNIX. Это избавит от ошибочных \r возвратов каретки, которые портят grep.

Кстати, вы можете использовать grep -f FILE для передачи grep списка шаблонов для поиска. Затем он выполнит один проход в поисках любого из этих шаблонов.

# After doing `dos2unix ip.file'...
grep -f ip.file fw.config

# Or...
grep -f <(dos2unix < ip.file) fw.config
5 голосов
/ 02 сентября 2010

GNU grep,

grep -f ip.txt config

Рекомендуется также не использовать для цикла с кат.(Если вы это сделаете, вы должны изменить IFS на $ '\ n').Вместо этого используйте цикл чтения.

while read -r line
do
  ....
done <"ip.txt"
1 голос
/ 02 сентября 2010
for i in $(tr '\r' '\n' < ip.file); do grep $i fw.config; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...