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