grep точное слово в 2 файлах, затем записать результат в файл

grep точное слово в 2 файлах, затем записать результат в файл

Я попробовал сделать это:

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:

  1. Нет гарантии, что соответствие соответствует USERNAMEполю. Например, FallenHope@…адрес электронной почты совпадает (и -wне помогает, поскольку @не является составным символом слова).
  2. 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

Связанный контент