如何基于日期筛选curl获取的XML中的指定URL?
解决XML中筛选指定日期的URL条目问题
处理XML这种结构化数据,别用grep/awk硬正则匹配,很容易因为标签换行、嵌套结构出问题,优先用专门的XML处理工具,给你几个可行方案:
方案1:用xmlstarlet(推荐)
xmlstarlet是专门的XML命令行工具,能精准解析结构,先确保你的系统安装了它(Debian/Ubuntu用apt install xmlstarlet,macOS用brew install xmlstarlet)。
假设你的XML结构是类似这样的(每个条目包含
https://example.com/1 2023-07-01 https://example.com/2 2023-08-05
执行以下命令就能直接输出2023-07的URL和对应日期:
curl -s https://url.com | xmlstarlet sel -t -m "//entry[starts-with(date/text(), '2023-07')]" -v "concat(log/text(), ' | ', date/text())" -n
-m "//entry[starts-with(date/text(), '2023-07')]":匹配所有包含日期以2023-07开头的节点 -v "concat(...)":把和 的文本内容拼接后输出 -n:每个结果换行
如果你的XML节点名不同(比如条目是//logitem[starts-with(date/text(), '2023-07')]。
方案2:用xmllint(系统自带概率高)
如果不想装新工具,xmllint很多系统默认自带(属于libxml2-utils包,Debian/Ubuntu可装apt install libxml2-utils),结合简单的文本处理命令也能实现:
curl -s https://url.com | xmllint --xpath "//entry[starts-with(date/text(), '2023-07')]" - | grep -E '(<log>|<date>)' | sed -e 's/<\/\?log>//g' -e 's/<\/\?date>//g' | paste - -
步骤分解:
- 用xmllint筛选出符合日期条件的
节点 - grep提取出包含
和 的行 - sed去掉标签,只保留文本内容
- paste把相邻的URL和日期行合并成一行
方案3:应急用awk(不推荐)
如果实在只能用awk,假设你的XML里
curl -s https://url.com | awk '/<log>/ {url=$0; sub(/<\/?log>/,"",url)} /<date>/ {date=$0; sub(/<\/?date>/,"",date); if (date ~ /^2023-07/) print url, "|", date}'
这个逻辑是:遇到
内容的提问来源于stack exchange,提问作者cristobal veas
相关产品推荐
相关产品推荐

