使用 grep 在 json 文件中搜索特殊模式

使用 grep 在 json 文件中搜索特殊模式

我想知道如何才能只 grep “created_at”:后面跟着 },以及如下所示的新行:

        "hashtags": [],
        "urls": []
    },
    "created_at": "Wed Oct 19 22:19:42 +0000 2016",
    "retweeted": false,
    "coordinates": null,
    "in_reply_to_user_id_str": null,
    "source": "<a href=\"http://tweetlogix.com\" rel=\"nofollow\">Tweetlogix</a>",
    "in_reply_to_status_id_str": null,
    "in_reply_to_screen_name": null,
    "in_reply_to_user_id": null,
    "place": null,
    "retweet_count": 0,
    "id_str": "788867246953201664"
},
{
    "favorited": false,
    "contributors": null,
    "truncated": false,
    "text": "Reddit Exposes Hillary Clinton Staff Trying To Frame Assange As \u2018Pedo\u2019 https://t.co/KNj14p8QqN via @yournewswire",
    "possibly_sensitive": false,
    "is_quote_status": false,
    "in_reply_to_status_id": null,
    "user": {
        "follow_request_sent": false,
        "has_extended_profile": false,
        "profile_use_background_image": true,
        "time_zone": "Eastern Time (US & Canada)",

最初,我使用grep -wirnE 'Wed Oct 19 2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00)) .* 2016' * > results_created_at ,然后使用wc -l results_created_at来计算在特定时间范围内创建的推文数量。然而,事实证明,我们可能拥有在该时间范围内创建的个人资料图片或用户。所以,我想知道如何使用我最初的 grep 命令来仅搜索推文?

我一直在查看我的文件中的许多推文,似乎在所有这些推文中,}, \n(换行符)后面都是“created_at”:然后在我们有文本后有几行。

答案1

添加-z到 grep 选项将使 grep 将换行符视为空终止符 ( \0),而不是单独的行,但它们似乎在正则表达式中无法匹配。 解决方法是简单地匹配所有内容 ( .*),直到所需模式的结尾(在您的例子中为“created_at”)。

接下来,您可以添加-o让 grep 仅输出实际匹配的内容,否则它将输出整个文件(因为它现在本质上是一行巨大的文本)。或者,如果输出到文件的唯一目的是稍后使用,wc -l我建议您使用 grep 的-c选项,它将打印匹配的数量而不是匹配本身。

这转换为以下命令:

grep -wirnEzc '},.*created_at' *

扩展此模式以包括您之前的模式,我们得到:

grep -wirnEzc '},.*created_at":\s"Wed Oct 19 2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00)) .* 2016' *

相关内容