Grep linhas correspondentes, mas retorna IDs de chave correspondentes na saída do GnuPG

1

Com esta entrada:

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

Eu quero que o grep retorne somente o ID da chave, por exemplo: C7927B92 . Usando o padrão de caracteres grep antes e depois da correspondência? , eu usei

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

resultando em

rsa2048/FB2D99F9

Como faço para limpar isso?

Eu quero encontrar IDs de chave curta duplicados. Em seguida, pego a lista grep de IDs de chave curta e, em seguida, classifico e testei para duplicatas com sort | uniq -d. No entanto, isso não funciona, pois fornece duplicatas falsas.

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

1 resposta

2

Você não compreende a sintaxe da expressão regular. rsa.{3,13} greps para strings que começam com rsa , seguido por 3 a 13 repetições de qualquer caractere ( . é o caractere curinga em expressões regulares).

Para obter o ID da chave, use grupos de correspondência. Você não pode fazer isso usando uma única instrução grep, e deve usar dois deles ou mudar para outra ferramenta, por exemplo, sed ou procurar outras maneiras de resolver o problema. Usando o GNU grep, que suporta o parâmetro -P que você já usou para expressões regulares no estilo do perl, você pode usar lookahead e lookbehind para alcançar o que está tentando fazer:

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

Esta é apenas uma maneira de alcançar o resultado desejado, e há muitas outras maneiras possíveis. O acima é provavelmente um dos mais limpos, uma alternativa pode ser simplesmente cortar o ID:

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

De qualquer forma, para fins de script, você deve ir para a saída separada por dois pontos alcançada com --with-colons , que é muito mais fácil de ser analisada. A seguir lista todas as chaves e, em seguida, filtros para chaves públicas (iniciando no início de cada linha usando ^ ), sem importar a validade da chave, mas filtrando chaves RSA (campo 4, ID do algoritmo 1) de tamanho 2048 bits e finalmente corta o campo 5, que contém o ID da chave.

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