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

637
StackAbstraction

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

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

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

grep -o -P 'rsa.' 

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

rsa2048/FB2D99F9 

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

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

gpg2 --list-keys | grep -o -P 'rsa.' | sort | uniq -d rsa2048/2642B5CD rsa2048/DF6AA92A 
1

1 ответ на вопрос

2
Jens Erat

You missunderstood the regular expression syntax. rsa. greps for strings starting with rsa, followed by 3 to 13 repetitions of any character (. is the wildcard character in regular expressions).

To grep for the key ID, use match groups. You cannot do this using a single grep statement, and either have to use two of them or switch to another tool, for example sed or look for other ways to solve the problem. Using GNU grep, which supports the -P parameter you already used for perl-style regular expressions, you can use lookahead and lookbehind to achieve what you're trying to do:

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

This is only one way to achieve the desired result, and there are lots of other possible ways. The one above is probably one of the cleanest, an alternative might be simply cutting of the ID:

echo 'rsa2048/2642B5CD' | grep -o -P 'rsa.' | cut -d/ -f2 

Anyway, for scripting purpose you should go for the colon-seperated output achieved with --with-colons, which is much better parseable. Following lists all keys, and then filters for public keys (starting at the beginning of each line using ^), without caring for the key's validity, but filtering RSA keys (field 4, algorithm ID 1) of size 2048 bits and finally cuts out field 5, which contains the key ID.

gpg2 --with-colons --list-keys | grep '^pub:[[:alpha:]]:2048:1:' | cut -d: -f5 
спасибо, отличные идеи. К вашему сведению --with-colons дает 64-битные идентификаторы ключей. мое использование сортировки | uniq -d хорошо? StackAbstraction 8 лет назад 0
Чего вы хотите достичь с помощью `sort | uniq -d`? Я думаю, что вы пропустили публикацию важной части вашего вопроса, например, «Я хочу найти дубликаты коротких ключей». Я удалил некоторую часть, касающуюся «массового поколения», которое (пока) кажется неуместным без дальнейшего объяснения и для вашего вопроса как есть. Jens Erat 8 лет назад 0
Исправить Я хочу найти дубликаты коротких ключей. поэтому я беру список коротких ключей с идентификатором grep, а затем сортирую и проверяю дубликаты с помощью uniq -d. Однако это не работает, поскольку предоставляет ложные дубликаты. StackAbstraction 8 лет назад 0

Похожие вопросы