목적:컬을 사용하여 원격 서버의 div 블록 내에 포함된 일련의 범위 블록에서 값을 추출합니다.
상태 페이지에서 일부 숫자를 추출하고 이 숫자가 들어 있는 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개의 스팬 블록을 포함할 수 있습니다. 이 스팬 블록에는 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)
grep
PCRE는 스위치와 함께 사용할 수 있도록 활성화 한 GNU의 역방향 확장입니다 -P
.
(?=pattern)
앞으로 확장을 모색하고 있는 PCRE 입니다.
이는 (?<=<span>)\[.*?\](?=</span>)
우리의 패턴이 이 두 패턴 내에 완전히 포함된다는 것을 의미합니다 [nuerical]
. 이 패턴은 출력에 포함되지 않으며 일치하고 발견된 내부 패턴만 반환됩니다.
.*
탐욕스러운 일치(가능한 가장 긴 일치)입니다. .*?
탐욕스럽지 않습니다(가능한 가장 짧은 일치).