Grep 匹配行但在 GnuPG 输出中返回匹配的密钥 ID

Grep 匹配行但在 GnuPG 输出中返回匹配的密钥 ID

有此输入:

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

我希望 grep 仅返回密钥 ID,例如:C7927B92。使用来自的模式匹配前后的 Grep 字符?, 我用了

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

导致

rsa2048/FB2D99F9

我该如何清理它?

我想查找重复的短键 ID。接下来,我获取短键 ID 的 grep 列表,然后对其进行排序,并使用 sort | uniq -d 测试重复项。但是它不起作用,因为它提供了错误的重复项。

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

答案1

您误解了正则表达式的语法。grepsrsa.{3,13}查找以 开头的字符串rsa,后跟 3 到 13 个任意字符(.是正则表达式中的通配符)。

要使用 grep 查找密钥 ID,请使用匹配组。您无法使用单个 grep 语句执行此操作,而必须使用两个 grep 语句或切换到另一个工具(例如 sed)或寻找其他方法来解决问题。使用 GNU grep(它支持-P您已用于 perl 样式正则表达式的参数),您可以使用前瞻和后瞻来实现您想要做的事情:

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

这只是实现所需结果的一种方法,还有很多其他可能的方法。上面的方法可能是最简洁的方法之一,另一种方法可能是简单地剪切 ID:

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

无论如何,出于脚本目的,您应该使用 实现的冒号分隔输出--with-colons,这样更容易解析。下面列出了所有密钥,然后过滤公钥(使用 从每行开头开始^),而不关心密钥的有效性,但过滤大小为 2048 位的 RSA 密钥(字段 4,算法 ID 1),最后删除包含密钥 ID 的字段 5。

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

相关内容