1

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 来做到这一点。

谢谢!

4

4 回答 4

1

在每个 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 的命令。

于 2020-11-18T22:43:51.767 回答
0

直接等价物是

perl -pe'/trustedCert/ and s/,\n/, /'

但是没有必要进行两场比赛。

perl -pe's/trustedCert.*,\K\n/ /'

将要处理的文件指定为 Perl one-liner


TLP 的解决方案不检查逗号,也不用空格替换换行符。

于 2020-11-18T21:16:41.710 回答
0
sed -zn 's/trustedCertEntry,\n/trustedCertEntry, /gp'

将输出作为单行使用,然后替换trustedCertEntry,并使用trustedCertEntry 和一个空格替换新行

于 2020-11-18T21:28:55.067 回答
0

要删除chomp包含字符串的行上的换行符,trustedCert您可以这样做:

perl -pe'chomp if /trustedCert/' 

根据您使用此命令的方式,应用程序会有所不同。

于 2020-11-18T20:55:32.407 回答