1

Имея этот вход:

rsa2048/C7927B82 2015-08-30
rsa2048/FB2D99F9 2015-08-30

Я хочу, чтобы grep возвращал только идентификатор ключа, например: C7927B92 . Использование шаблона из символов Grep до и после матча?, Я использовал

grep -o -P 'rsa.{3,13}'

в результате чего

rsa2048/FB2D99F9

Как мне это убрать?

Я хочу найти дубликаты коротких ключей. Затем я беру список коротких ключей с идентификатором grep, а затем сортирую и проверяю дубликаты с помощью sort | uniq -d. Однако это не работает, поскольку предоставляет ложные дубликаты.

gpg2 --list-keys | grep -o -P 'rsa.{3,13}' | sort | uniq -d
 rsa2048/2642B5CD
 rsa2048/DF6AA92A

1 ответ1

2

Вы неправильно поняли синтаксис регулярного выражения. rsa.{3,13} greps для строк, начинающихся с rsa , за которыми следуют от 3 до 13 повторений любого символа (. - символ подстановки в регулярных выражениях).

Чтобы найти идентификатор ключа, используйте группы совпадений. Вы не можете сделать это с помощью одного оператора grep, и вам придется либо использовать два из них, либо переключиться на другой инструмент, например, sed, или искать другие способы решения проблемы. Используя GNU grep, который поддерживает параметр -P вы уже использовали для регулярных выражений в стиле perl, вы можете использовать lookahead и lookbehind для достижения того, что вы пытаетесь сделать:

echo 'rsa2048/2642B5CD' | grep -o -P '(?<=rsa2048/)[[:xdigit:]]{8}'

Это только один из способов достижения желаемого результата, и существует множество других возможных способов. Приведенный выше, вероятно, один из самых чистых, альтернативой может быть просто сокращение удостоверения личности:

echo 'rsa2048/2642B5CD' | grep -o -P 'rsa.{3,13}' | cut -d/ -f2

В любом случае, для целей написания сценариев вы должны получить разделенный двоеточиями вывод, достигнутый с --with-colons , который гораздо лучше разбирается. Ниже перечислены все ключи, а затем выполняется фильтрация открытых ключей (начиная с начала каждой строки с использованием ^), без учета действительности ключа, но с фильтрацией ключей RSA (поле 4, идентификатор алгоритма 1) размером 2048 бит и, наконец, срезом поле 5, которое содержит идентификатор ключа.

gpg2 --with-colons --list-keys | grep '^pub:[[:alpha:]]:2048:1:' | cut -d: -f5

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .