如何使用bash脚本从CVEdetails网页源码中提取vendor和product字段值
解决方案
你可以通过文本匹配工具组合实现提取需求,以下提供两种无需额外安装依赖(或仅需常用工具)的实现方式:
方案1:使用自带grep+sed实现(无额外依赖)
直接通过管道流式处理页面内容,不需要生成临时文件:
# 拉取页面内容到变量 cve_page=$(wget -qO- https://www.cvedetails.com/cve/CVE-2017-3169) # 提取vendor值 vendor=$(echo "$cve_page" | grep -A 10 "Vulnerable Versions" | grep -m1 '/vendor/' | sed 's/.*>\([^<]*\)<\/a>.*/\1/' | xargs) # 提取product值 product=$(echo "$cve_page" | grep -A 10 "Vulnerable Versions" | grep -m1 '/product/' | sed 's/.*>\([^<]*\)<\/a>.*/\1/' | xargs)
- 逻辑说明:先定位到
Vulnerable Versions表头之后的10行内容,分别匹配vendor和product对应的链接行,提取a标签的文本内容后用xargs去除首尾空白字符。 - 执行后可直接通过
echo $vendorecho $product验证结果,输出分别为Apache和Http Server。
方案2:使用pcregrep多行匹配(写法更简洁)
如果你的系统预装了pcregrep,可通过正则捕获组直接提取:
# 拉取页面内容到变量 cve_page=$(wget -qO- https://www.cvedetails.com/cve/CVE-2017-3169) # 提取vendor值 vendor=$(echo "$cve_page" | pcregrep -M -o1 'Vulnerable Versions[\s\S]*?<tr>[\s\S]*?<a[^>]*>([^<]+)<\/a>') # 提取product值 product=$(echo "$cve_page" | pcregrep -M -o1 'Vulnerable Versions[\s\S]*?<tr>[\s\S]*?<a[^>]*>[^<]+<\/a>[\s\S]*?<a[^>]*>([^<]+)<\/a>')
- 参数说明:
-M开启多行匹配支持,-o1输出第一个捕获组的内容,[\s\S]*?是惰性匹配任意字符,避免跨条目匹配。
内容的提问来源于stack exchange,提问作者CrisoNikon
相关产品推荐
相关产品推荐

