首页 > 解决方案 > 连接来自“keytool -list”输出的证书行

问题描述

Java keytool 命令用于管理 Java 密钥库。在这种情况下,我列出了任何 Java 运行时附带的 cacerts 文件的内容。命令是:

keytool -list -keystore ./cacerts -storepass somethingorother

输出如下所示:

Keystore type: jks Keystore provider: SUN
Your keystore contains 164 entries
wizardgeneratedalias, Nov 17, 2020, trustedCertEntry, Certificate fingerprint (SHA1):BA:14:BF:5D:17:2F:F8:FE:29:44:90:12:46:C1:46:B1:C6:80:CB:6F securetrustca [jdk], Nov 7, 2006, trustedCertEntry, 
Certificate fingerprint (SHA1): 87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11

在标题之后,每个证书以两行显示,第一行以存储证书的别名(“wizardgeneratedalias”)开头,以“trustedCertEntry”结尾,第二行以“证书指纹”开头。

我想将这两行动态组合成一条,这样我就可以通过管道传递到下一个命令,无论是 grep 还是 sort 或 whatevs。

在 vim 中非常简单:

:g/trustedCert/s/,$\n/, /

基本上在这里搜索带有字符串“trustedCert”的任何 (g/) 行,在行尾查找逗号和换行符,然后用逗号和空格替换它。

我从来没有想过如何用 awk 或 sed (无论如何不是真正的 sed 的东西)或 perl 来做到这一点。

谢谢!

标签: perlawkconcatenationkeytoolcacerts

解决方案


在每个 UNIX 机器上的任何 shell 中使用任何 awk 并且不将整个输入读入内存(在这种特定情况下可能没什么大不了的):

$ cat file | awk '{printf "%s%s", $0, (/trustedCertEntry,[[:space:]]*$/ ? "" : ORS)}'
Keystore type: jks Keystore provider: SUN
Your keystore contains 164 entries
wizardgeneratedalias, Nov 17, 2020, trustedCertEntry, Certificate fingerprint (SHA1):BA:14:BF:5D:17:2F:F8:FE:29:44:90:12:46:C1:46:B1:C6:80:CB:6F securetrustca [jdk], Nov 7, 2006, trustedCertEntry, Certificate fingerprint (SHA1): 87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11

在上面我只是cat file用来代替你正在运行的任何你想通过管道传递给 awk 的命令。


推荐阅读