Linux中grep匹配证书时间后如何获取对应Subject行内容
实现目标
从空行分隔的证书条目块中,当块内时间行匹配2022、Jun关键词时,提取对应条目的Subject字段及用户名。
逐行grep的方案只能拿到匹配的单行内容,无法关联同一块内的其他行,用以下两种原生Linux命令即可实现,无需安装额外工具:
方案1:awk 段落匹配(稳定性最高,推荐)
利用awk支持按段落(空行分隔)读取内容的特性,直接把每个证书块作为独立判断单元,匹配规则和原有grep逻辑完全一致:
# 替换前面的「你的证书输出命令」为实际生成证书列表的命令即可 你的证书输出命令 | awk -v RS='' '/2022/ && /Jun/ {print $0}'
- 参数说明:
-v RS='':将记录分隔符设置为空行,每个证书块为1条处理记录/2022/ && /Jun/:判断当前证书块同时包含两个关键词,匹配成功才输出整个块
如果只需要提取Subject整行,在后面加管道筛选即可:
你的证书输出命令 | awk -v RS='' '/2022/ && /Jun/ {print $0}' | grep '^Subject ='
如果只需要提取用户名(CN字段值),可以直接在awk里处理完输出,不用额外管道:
你的证书输出命令 | awk -v RS='' '/2022/ && /Jun/ {split($3,a,/[=,]/); print a[2]}'
用提供的示例内容运行,会直接输出User_A。
方案2:grep 上下文匹配(写法简单,适合临时用)
利用grep的-B参数输出匹配行的前序行,因为每个证书块里时间行是第三行,往前数2行就是Subject行:
你的证书输出命令 | grep -B2 -E '2022.*Jun|Jun.*2022' | grep '^Subject ='
- 参数说明:
-B2:匹配到符合规则的时间行时,同时输出该行前面的2行内容-E:启用扩展正则,匹配两个关键词不分先后的情况
注意:这个方案依赖证书块的固定行顺序,如果后续证书输出的行位置变了(比如Status行和时间行换顺序),会匹配出错,优先用awk方案更可靠。
内容的提问来源于stack exchange,提问作者Exonix
相关产品推荐
相关产品推荐

