Поиск специализированных шаблонов с использованием 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?
Я просматривал многие твиты в своих файлах и, кажется, во всех из них, }, \n (переводы строк), следует "create_at": и затем несколько строк после того, как у нас есть текст.
1 ответ
Добавление -z
к вашим параметрам grep заставит grep рассматривать символы новой строки как завершающие символы (\0
), в отличие от отдельных строк, однако они не выглядят сопоставимыми в регулярном выражении. Обходной путь для этого должен просто соответствовать всему (.*
) до конца нужного вам паттерна (в вашем случае "creation_at").
Далее вы можете добавить -o
чтобы grep выводил только то, что в действительности соответствует, в противном случае он выводит весь файл (так как теперь это по сути одна гигантская строка). В качестве альтернативы, если единственная цель вывода в файл состоит в том, чтобы позже wc -l
Я бы вместо этого предложил вам использовать grep's -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' *