有此输入:
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