如何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表达式.[] | 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"

相关内容