Поиск в одном файле, чтобы узнать, содержит ли он информацию из другого файла

Вам придется заставить интерпретатор игнорировать строку execи поместить содержимое скрипта в файл в обычном режиме. Варианты включают:

  • Полиглот-скрипты, в которых команда execнаписана так, что выглядит как комментарий, строка или похожа на реальный интерпретатор. Примеры :
  • передать скрипт интерпретатору с удаленными начальными строками

0
28.04.2021, 22:33
2 ответа

Эта функция встроена в 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.

4
28.04.2021, 22:51

Альтернативный подход, который мне нравится для этого типа проблем, — это команда 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

Надеюсь, это поможет!

3
28.04.2021, 22:51

Теги

Похожие вопросы