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