複数行をgrepする方法は?

複数行をgrepする方法は?

Grepは次のことを理解しています。

curl https://api.coinmarketcap.com/v1/ticker/ | grep "clipper-coin"

しかし、これではありません:

curl https://api.coinmarketcap.com/v1/ticker/ | grep "{*clipper-coin*}"

私の予想結果は次のとおりです。

    {
        "id": "clipper-coin",
        "name": "Clipper Coin",
        "symbol": "CCCX",
        "rank": "100",
        "price_usd": "0.0159861038",
        "price_btc": "0.00000167",
        "24h_volume_usd": "28652.7472891",
        "market_cap_usd": "60356670.0",
        "available_supply": "3775570996.0",
        "total_supply": "5000000000.0",
        "max_supply": null,
        "percent_change_1h": "1.12",
        "percent_change_24h": "0.24",
        "percent_change_7d": "-6.9",
        "last_updated": "1564524066"
    }

何が変わるべきですか?

答え1

理解できますが、望む方法ではありません。正規表現のフラグメントは{*ゼロ個以上の{文字に一致し、n*ゼロ個以上の文字に一致するため、式全体は等にn一致{*clipper-coin*}します。{clipper-coin}{{{clipper-coi}clipper-coinnnnnn}

行指向のテキスト処理ユーティリティ(標準のUnixテキスト処理ツールボックスのほとんどのユーティリティなど)は、JSONなどの構造化データを解析するのには不十分なツールです(GNUチームと他のチームがアドインを使用して拡張した場合でも、にもかかわらず)。代わりにJSONパーサーを使用したいと思うかもしれません。

返されたJSONドキュメントの内容を解析するには(idこのサーバーの出力にはbitcoin何も表示されません)、JSONパーサーを使用してください。例:clipper-coinjq

$ curl -s 'https://api.coinmarketcap.com/v1/ticker/' | jq '.[] | select(.id == "bitcoin")'
{
  "id": "bitcoin",
  "name": "Bitcoin",
  "symbol": "BTC",
  "rank": "1",
  "price_usd": "9626.82712316",
  "price_btc": "1.0",
  "24h_volume_usd": "13830555865.2",
  "market_cap_usd": "171817319309",
  "available_supply": "17847762.0",
  "total_supply": "17847762.0",
  "max_supply": "21000000.0",
  "percent_change_1h": "0.46",
  "percent_change_24h": "1.02",
  "percent_change_7d": "-3.11",
  "last_updated": "1564526372"
}

このjq式は、返されたJSON配列をフィルタリングして、キーが値に対応する要素を.[] | select(.id == "bitcoin")見つけます。idbitcoin

price_usdサンプル値を選択するには、次を使用します。

$ curl -s 'https://api.coinmarketcap.com/v1/ticker/' | jq '.[] | select(.id == "bitcoin").price_usd'
"9630.84837853"

引用符を削除するには、jq -r代わりにjustを使用してくださいjq

jqマニュアルも参照してください。

jq次のように、percent_change_1h最も高い値を持つアイテムのシンボルを取得する複雑なクエリを簡単に作成することもできます。

$ curl -s 'https://api.coinmarketcap.com/v1/ticker/' | jq 'max_by(.percent_change_1h | tonumber).symbol'
"WAX"

関連情報