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
表达式.[] | select(.id == "bitcoin")
将过滤返回的 JSON 数组,以查找其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"