поиск специализированных шаблонов с использованием grep в файле json

Интересно, как я могу использовать grep только для «create_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, которую я имел? (переводы строки) сопровождается "create_at": а затем несколько строк после того, как у нас есть текст.

1
задан 18 January 2018 в 19:47

1 ответ

Добавление -z к вашим опциям grep заставит grep рассматривать новые строки как нулевые завершающие символы (\0), а не отдельные строки, однако они не выглядят сопоставимыми в регулярном выражении. Обходной путь для этого состоит в том, чтобы просто сопоставить все (.*) до конца вашего желаемого шаблона (в вашем случае «creation_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' *
1
ответ дан 18 January 2018 в 19:47

Другие вопросы по тегам:

Похожие вопросы: