如何编写正则匹配日志中含指定域名的YAML文档并筛选输出
解决方案
直接用记录分隔符拆分YAML文档块后逐块筛选即可,不需要写复杂的多行环视正则,逻辑更稳定,也适配tail -F的流式实时输出场景。
推荐Perl单行命令(所有Linux发行版默认预装,适配流式场景)
tail -F logfile.log | perl -ne ' $/ = "\n---\n"; # 以单独成行的---作为文档分隔符 $| = 1; # 关闭输出缓冲,保证实时输出 # 匹配当前块含指定hostname规则就输出 print $_ if /hostname: .*?domain\.com/ || ($. == 1 && s/^---\n// && /hostname: .*?domain\.com/) '
如果不需要特别严格区分单独成行的分隔符,也可以简化为:
tail -F logfile.log | perl -ne '$/="---"; $|=1; print $/.$_ if /hostname: .*?domain\.com/'
Awk实现版本(同样默认预装)
tail -F logfile.log | awk -v RS='\n---\n' '/hostname: .*domain\.com/{print "---\n"$0}'
实现思路
- 把输入的记录分隔符直接设置为YAML文档的分隔符
---,不需要手动写正则拆分文档块,脚本内置的拆分逻辑性能更高、容错性更强 - 逐块检查是否包含符合规则的
hostname字段,匹配成功就输出对应块 - 关闭输出缓冲保证
tail -F场景下的实时性,不会出现日志延迟输出的问题
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

