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-coin
jq
$ 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")
見つけます。id
bitcoin
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"