Вам придется заставить интерпретатор игнорировать строку exec
и поместить содержимое скрипта в файл в обычном режиме. Варианты включают:
exec
написана так, что выглядит как комментарий, строка или похожа на реальный интерпретатор. Примеры :40_custom
, который идет другим путем :берет скрипт с шебангом, а затем печатает его без интерпретации. Эта функция встроена в grep
. Используйте опцию -f
:
grep -Fx -f ipex.txt unip.txt
Это печатает все совпадения. Если вас интересует только ответ да/нет, используйте опцию -q
("тихо"):
if grep -Fxq -x -f ipex.txt unip.txt; then
echo unip.txt contains IP addresses from ipex.txt
else
echo "unip.txt doesn't contain IP addresses from ipex.txt"
fi
Почему -F
? По умолчанию grep интерпретирует строки в ipex.txt
как регулярные выражения, а точки в этих строках означают «любой символ». Это может (и, вероятно, )приведет к ложным совпадениям. -F
обеспечивает соответствие строк-констант, а не регулярных выражений.
Почему -x
? Это гарантирует, что IP-адреса сопоставляются целым строкам в unip.txt
, тем самым предотвращая частичное совпадение, например. предотвращение совпадения 49.235.113.20
с адресом 49.235.113.205
.
Альтернативный подход, который мне нравится для этого типа проблем, — это команда comm
. Полезно сравнить два файла и определить (1 )строки, найденные только в файле 1, (2 )строки, найденные только в файле 2, и (3 )строки, найденные в обоих файлах. Единственным недостатком является то, что оба входных файла должны быть отсортированы, и он соответствует точным строкам (, т.е. не ищет подстроки в строке ).
Я сохранил ваши примеры как unip.txt
и ipex.txt
, отсортировал их по sort
, затем запустил comm unip.txt ipex.txt
. Выход:
146.148.13.9
148.216.29.46
148.70.23.131
148.72.212.161
149.56.141.193
151.141.0.0
49.235.113.205
50.115.166.136
51.15.134.103
51.15.70.104
51.15.87.74
97.89.32.238
Вывод имеет три столбца с разделителями табуляции -, соответствующие точкам (1 ), (2 )и (3 ), которые я сделал выше. Вы можете подавить вывод столбца следующим образом:comm -1 unip.txt ipex.txt
. Эта команда , а не напечатает первый столбец.
Итак, в целом, чтобы ответить на ваш вопрос, вам нужно отсортировать входные файлы, а затем запустить comm -12 unip.txt ipex.txt
, который отключит первые два столбца вывода, а затем напечатает строки, найденные в обоих файлах:
148.70.23.131
51.15.134.103
Надеюсь, это поможет!