获取两个给定变量字符串之间的内容

时间:2018-07-11 08:46:48

标签: bash grep openssl ssl-certificate

如何获取两个给定字符串之间的内容? 没有输出。

keyword_01=’Serial\s\+Number’;
keyword_02='Signature\s\+Algorithm';
openssl s_client -servername example.com -connect example.com:443 </dev/null 2>/dev/null | openssl x509 -text | grep -i -o -P --color=auto '(?<=$keyword_01).*(?=$keyword_02)'

基本建议有效,但如上拼凑而成,则无效。

echo "Here is a string" | grep -o -P --color=auto '(?<=Here).*(?=string)'

此处的目的是获取2个字段之间的SSL证书内容。

例如在这里,答案将是“ 0e:64:c5:fb:c2:36:ad:e1:4b:17:2a:eb:41:c7:8c:b0”

1 个答案:

答案 0 :(得分:1)

可以通过内置的bash参数扩展来实现:

#!/bin/bash  
keyword1='Serial\s\+Number'
keyword2='Signature\s\+Algorithm'

inbetween='0e:64:c5:fb:c2:36:ad:e1:4b:17:2a:eb:41:c7:8c:b0'

src="$keyword1$inbetween$keyword2"

strip_begin=${src#"$keyword1"}
strip_end=${strip_begin%"$keyword2"}

[ "$inbetween" = "$strip_end" ] && echo "It works" || echo "It doesn't work"

有关更多详细信息,请参见bash substring removal

但是为了简单地从命令输出中检索两个必填字段,请尝试如下操作:

certificate=$(openssl s_client -servername example.com -connect example.com:443 </dev/null 2>/dev/null | openssl x509 -text)

serial_number_key="Serial Number:"
serial_number=$(echo "$certificate" | awk "/$serial_number_key/ "'{ getline; print $0}' | tr -d " ")
echo "$serial_number"

signature_algorithm=$(echo "$certificate" | grep -m1 'Signature Algorithm:')
signature_algorithm=${signature_algorithm##*Signature Algorithm: }
echo "$signature_algorithm"

certificate_content=$(awk '/BEGIN CERTIFICATE/ {flag=1;next;} /END CERTIFICATE/ {flag=0} flag' <(echo "$certificate"))
echo "$certificate_content"

基本思想是将证书存储在变量中;然后使用常见的Unix工具,例如grepsedawkcuttr等。等以及诸如参数扩展之类的shell内置函数来检索各个字段。

如果您需要检索更多的值,可能会有更优雅的方法;但是最佳的解决方案取决于了解更详细的要求。