目的:カールを使用して、リモートサーバーの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>
ソースはすべて1行にあります。この特定の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>
ブロックを抽出し、
2番目のステップgrep
は内部ブロック内のデジタル部分を抽出することです<span>[...]</span>
。
(?<=pattern)
grep
PCREは、スイッチで使用するために有効にしたGNUの逆方向拡張です-P
。
(?=pattern)
これから拡張を模索しているPCREです。
これは(?<=<span>)\[.*?\](?=</span>)
、私たちのパターンがこれら2つのパターン内に完全に含まれることを意味します[nuerical]
。このパターンは出力に含まれず、一致し、見つかった内部パターンのみが返されます。
.*
貪欲な一致(可能な限り長い一致)です。.*?
貪欲ではありません(できるだけ短い一致)。