英文:
How do you reverse the certificate blocks given a CER file using a linux script?
问题
tac -s '-----BEGIN CERTIFICATE-----' mycert.cer | awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/' | tac
英文:
How do you reverse the certificate blocks given a CER file using a linux script (i.e. awk, sed, etc..) ?
So suppose I have a file called mycert.cer that looks like:
-----BEGIN CERTIFICATE-----
this is sentence1
this is sentence2
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence3
this is sentence4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence5
this is sentence6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence7
this is sentence8
-----END CERTIFICATE-----
I want the output to look like:
-----BEGIN CERTIFICATE-----
this is sentence7
this is sentence8
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence5
this is sentence6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence3
this is sentence4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence1
this is sentence2
-----END CERTIFICATE-----
I have tried the following:
tac -s'-----BEGIN CERTIFICATE-----' mycert.cer | awk '/-----BEGIN CERTIFICATE-----/, /-----END CERTIFICATE-----/'
but this command gave the following incorrect output:
-----BEGIN CERTIFICATE-----
this is sentence3
this is sentence4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence1
this is sentence2
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE----------BEGIN CERTIFICATE-----
How do I fix the command so that I get the desired output?
答案1
得分: 3
使用任何awk加上tac:
$ tac mycert.cer | awk '
{ cert = $0 ORS cert }
/BEGIN CERT/ { printf "%s", cert; cert="" }
'
-----BEGIN CERTIFICATE-----
这是句子7
这是句子8
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
这是句子5
这是句子6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
这是句子3
这是句子4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
这是句子1
这是句子2
-----END CERTIFICATE-----
或者只使用awk:
$ awk '
{ cert = cert $0 ORS }
/END CERT/ { certs[++numCerts] = cert; cert="" }
END { for (i=numCerts; i>=1; i--) printf "%s", certs[i] }
' mycert.cer
-----BEGIN CERTIFICATE-----
这是句子7
这是句子8
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
这是句子5
这是句子6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
这是句子3
这是句子4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
这是句子1
这是句子2
-----END CERTIFICATE-----
英文:
Using any awk plus tac:
$ tac mysert.cer | awk '
{ cert = $0 ORS cert }
/BEGIN CERT/ { printf "%s", cert; cert="" }
'
-----BEGIN CERTIFICATE-----
this is sentence7
this is sentence8
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence5
this is sentence6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence3
this is sentence4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence1
this is sentence2
-----END CERTIFICATE-----
or just awk:
$ awk '
{ cert = cert $0 ORS }
/END CERT/ { certs[++numCerts] = cert; cert="" }
END { for (i=numCerts; i>=1; i--) printf "%s", certs[i] }
' mycert.cer
-----BEGIN CERTIFICATE-----
this is sentence7
this is sentence8
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence5
this is sentence6
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence3
this is sentence4
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
this is sentence1
this is sentence2
-----END CERTIFICATE-----
答案2
得分: 1
在awk中:
awk 'BEGIN{RS="";ORS=FS="-----END CERTIFICATE-----\n"}{while(--NF)print $NF}' 文件名
# 或稍微长一点的版本
awk -v RS="" -v FS="-----END CERTIFICATE-----\n" '{while(--NF)printf "%s",$NF FS}' 文件名
# 如果你找到一个不允许更改NF的awk(我还没有找到过)
# 把操作改成 for(i=NF;--i;)print $i 或 printf "%s",$i FS
在perl中:
perl -n0777e 'map{print}reverse split $/="-----END CERTIFICATE-----\n"' 文件名
这两种方法都将整个文件视为一个"record",如果你的awk不是GNU版本(现在相当少见但不无可能),它在处理过大的文件时可能会失败。
英文:
In awk:
awk 'BEGIN{RS="";ORS=FS="-----END CERTIFICATE-----\n"}{while(--NF)print $NF}' file
# or slightly longer
awk -v RS="" -v FS="-----END CERTIFICATE-----\n" '{while(--NF)printf "%s",$NF FS}' file
# or you ever find an awk that doesn't allow changing NF (I haven't)
# change action to for(i=NF;--i;)print $i resp printf "%s%,$i FS
In perl:
perl -n0777e 'map{print}reverse split $\="-----END CERTIFICATE-----\n"' file
Both of these treat the whole file as one 'record' and if your awk is not GNU (fairly rare nowadays but not unknown) it might fail for a too-large file.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论