bash - 获取两个给定变量字符串之间的内容
问题描述
如何获取 2 个给定字符串之间的内容?没有输出。
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'
解决方案
可以通过内置的 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 子字符串删除。
但是为了从上面的命令输出中简单地检索两个必填字段,请尝试以下操作:
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 工具,如grep
, sed
, awk
, cut
,tr
等。人。和 shell 内置函数,如参数扩展来检索各个字段。
如果您需要检索更多值,可能会有更优雅的方式;但最佳解决方案取决于了解更详细的需求。
推荐阅读
- ansible - Ansible - 合并和合并列表
- python - 未定义使用 tkinter root 的 python 错误
- python - 如何从 python/pygame 中的文件夹导入多个图像
- python - 读取 JSON 文件收到错误消息
- python - 根据用户对消息的反应显示另一页信息 (discord.py)
- c++ - ctor 错误函数已定义且具有不同类型的 c++ 或 mql
- python - 即使所有字段都有值,django is_valid 也会为模型表单返回 false
- java - 如何修复异常 java.lang.StringIndexOutOfBoundsException?
- google-cloud-data-fusion - 谷歌云数据融合校验和文件 csv
- python - 从三个数据帧动态创建字符串