客观的:使用curl从远程服务器上某个div块中嵌入的一系列span块中提取数值
我需要从状态页面中提取一些数字,并确定保存这些数字的 div 块。
格式如下;
<div class="stats-values"><img src="some-image-name.jpg"><span>[numeric]</span> <img src="some-image-name.jpg"><span>[numeric]</span></div>
来源全部在一行中。这个特定的 div 块仅出现一次,并且可以通过类名轻松识别,但可能包含多达 6 或 7 个 span 块,这正是我所追求的;这些跨度块没有 ID 或类。
我对装饰图像不感兴趣,只对跨度块内的数字感兴趣,我想输出逗号或空格分隔的数字。
我想象它应该是这样的:
curl http://webpage.example.com/status | grep "<div class=\"stats-values\">.*</div>" | grep "<span>.*</span>"
我尝试了一些在杂项搜索中出现的例子。论坛,但到目前为止还没有结果。
我希望能得到有关结构和语法的指针,无论是 grep、sed 还是 awk。
答案1
curl http://webpage.example.com/status |\
grep -oP '<div class="stats-values">.*?</div>' |\
grep -oP '(?<=<span>)\[.*?\](?=</span>)'
首先grep
提取相关<div ...></div>
块;
第二步grep
提取内部块内的数字部分<span>[...]</span>
。
(?<=pattern)
PCRE 是 GNU 的正向后向扩展,grep
我们启用它与 switch 一起使用-P
。
(?=pattern)
是 PCRE 正向前瞻扩展。
这(?<=<span>)\[.*?\](?=</span>)
意味着我们的模式[nuerical]
完全在这两个模式之内;这些是不包含在输出中的,并且只会返回匹配和找到的内部模式。
.*
是贪婪匹配(最长可能的匹配);.*?
是非贪婪的(最短的可能匹配)