Grep совпадающие строки, но возвращающие совпадающие идентификаторы ключей в выводе GnuPG

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

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 ответ

Решение

Вы неправильно поняли синтаксис регулярного выражения. 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
Другие вопросы по тегам