Я попробовал сделать это:
grep FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
Я хочу найти имя пользователя FallenHope в двух базах данных, но они не в одинаковом формате, и для других имен пользователей будет выдана просто куча имен пользователей, полученных из исходного имени пользователя.
Форматы базы данных:
1 USERNAME [email protected] hashedpass
и
USERNAME:[email protected]:ip:ip:hashedpass
Я также пробовал делать
grep -w FallenHope DATABASE1.txt DATABASE2.sql >> breached.txt
но это все еще не работает
есть ли способы это сделать?
решение1
Вот что man 1 grep
говорится о grep -w
:
-w
,--word-regexp
Выберите только те строки, которые содержат совпадения, образующие целые слова. Проверка заключается в том, что совпадающая подстрока должна быть либо в начале строки, либо ей должен предшествовать не являющийся частью слова символ. Аналогично, она должна быть либо в конце строки, либо за ней должен следовать не являющийся частью слова символ. Символы, образующие слово, — это буквы, цифры и подчеркивание. […]
grep FallenHope
В вашем подходе, основанном на или , есть как минимум две проблемы grep -w FallenHope
:
- Нет гарантии, что соответствие соответствует
USERNAME
полю. Например,FallenHope@…
адрес электронной почты совпадает (и-w
не помогает, поскольку@
не является составным символом слова). FallenHope-12345
совпадает (и-w
не помогает, поскольку-
не является составным символом слова).
Вам нужнопортнойшаблон grep
, подходящий для каждого форматав отдельности. Кажется, во втором случае это проще.
USERNAME:[email protected]:ip:ip:hashedpass
Следующий grep
будет искать FallenHope
в самом начале строки. Завершение :
в шаблоне делает сопоставление FallenHope-1
или FallenHopes
невозможным.
grep '^FallenHope:' DATABASE2.sql
Добавьте перенаправление ( >> breached.txt
) после того, как убедитесь, что мой код делает то, что вам нужно.
И для первого формата
1 USERNAME [email protected] hashedpass
Должно сработать что-то вроде этого:
grep '^[[:digit:]]*[[:blank:]]*FallenHope[[:blank:]]' DATABASE1.txt
Он ищет ноль или более цифр в начале строки, за которыми следуют ноль или более пробелов, за которыми следует FallenHope
, за которым следует пробел. Вы можете предпочесть "один или более" лучше, чем "ноль или более", но если формат строгий, то "ноль или более" должно быть достаточно.
В любом случае вам нужно настроить шаблон под формат. Если есть какие-то странности, которые я не предвидел, и вы их знаете, настройте шаблон соответствующим образом.
Я думаю, awk
что можно сделать и это. Инструмент предназначен для работы споля, этот подход кажется идеальным для работы. Пример кода:
awk '$2=="FallenHope"' DATABASE1.txt
awk -F : '$1=="FallenHope"' DATABASE2.sql