在 json 输出中 grep 一个字符串

在 json 输出中 grep 一个字符串

我有一个 api 请求,以 json 形式提供输出(表单?布局?主体?怎么说?)。请参见此处:

    {
        "title": "Another Life (2019)",
        "alternateTitles": [
            {
                "title": "Another Life",
                "seasonNumber": -1
            }
        ],
        "sortTitle": "another life 2019",
        "seasonCount": 2,
        "totalEpisodeCount": 20,
        "episodeCount": 10,
        "episodeFileCount": 10,
        "sizeOnDisk": 2979171318,
        "status": "continuing",
        "overview": "Astronaut Niko Breckenridge and her young crew face unimaginable danger as they go on a high-risk mission to explore the genesis of an alien artifact.",
        "previousAiring": "2019-07-25T07:00:00Z",
        "network": "Netflix",
        "airTime": "03:00",
        "seasons": [
            {
                "seasonNumber": 1,
                "monitored": true,
                "statistics": {
                    "previousAiring": "2019-07-25T07:00:00Z",
                    "episodeFileCount": 10,
                    "episodeCount": 10,
                    "totalEpisodeCount": 10,
                    "sizeOnDisk": 2979171318,
                    "percentOfEpisodes": 100.0
                }
            },
            {
                "seasonNumber": 2,
                "monitored": true,
                "statistics": {
                    "episodeFileCount": 0,
                    "episodeCount": 0,
                    "totalEpisodeCount": 10,
                    "sizeOnDisk": 0,
                    "percentOfEpisodes": 0.0
                }
            }
        ],
        "tags": [],
        "added": "2020-12-02T15:01:43.942456Z",
        "ratings": {
            "votes": 26,
            "value": 6.0
        },
        "qualityProfileId": 3,
        "id": 24
    }

我列出了大约 20 个这样的输出。这是其中之一。

问题

在长列表中,我将使用 grep 搜索"\"title\": \"Another Life (2019)\"",其中 Another Life (2019) 可以是 20 个系列中的任何一个。需要获取 id(在输出的底部)。

但这样做grep -Eo "\"id\": [0-9]{1,4}"不会起作用,因为我会得到 20 个 Id 作为输出。

grep -Eo "\"title\": \"Another Life (2019)\".*\"id\": [0-9]{1,4}"也是不行。

执行完grep -A 100 "\"title\": \"Another Life (2019)\""之后再 grep id 也不起作用。

我似乎无法让它按我想要的方式工作。我总体上无法理解如何抓取 JSON 主体中的字符串。

如果我选择“Devs”,我想获取系列 Devs 的 ID。如果我选​​择(无论是设置变量还是在命令中的某个位置插入名称)“Prison Break”,我想获取系列 Prison Break 的 ID。

谢谢!

答案1

使用--perl-regexp(PCRE)对我有用:

grep -P -- '"id": \K[0-9]{1,4}' infile.txt

通知\K将忽略其之前的匹配部分(来源)。如果您只想要数字,您可以添加选项-o

grep -oP -- '"id": \K[0-9]{1,4}' infile.json

如果您需要多行搜索,请添加选项-z

grep -zPo -- '(?s)Another Life.*?"id": \K[0-9]{1,4}\n' infile.json

其中(?s)激活 PCRE_DOTALL,这意味着 '.' 找到任何字符或换行符(来源)。

上述命令将在包含以下内容的行之后输出所有出现的 id 值另一种生活。似乎不可能只捕获第一次出现的grep,所以我们需要用另一个工具来处理输出,比如说head

grep -zPo -m1 -- '(?s)Another Life.*?"id": \K[0-9]{1,4}.' infile.json | head -1

相关内容