Поиск по "create_at": в следующей строке следует "retweeted": во множестве json-файлов для определенного диапазона

У меня есть большое количество файлов json, и ранее мне сказали использовать следующую строку для поиска, если твит создан в определенный промежуток времени в дате:

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' *

Я не знаю, что именно пытаются представить следующие:

2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00))

На данный момент мне нужно изменить его так, чтобы я мог найти количество результатов, возвращаемых этим grep, которые находятся в диапазоне между 17 июля 2016 года и 8 ноября 2016 года для поля "selected_at". Вот пример одного из этих файлов json: https://hastebin.com/budovutume.scala

Как видите, каждый файл JSON может содержать различные твиты. Так что в основном я ищу, чтобы просмотреть все эти файлы *.json и искать "created_at": шаблоны, которые следуют в следующей строке "retweeted": потому что другие вещи, как профиль или изображение профиля может иметь атрибут "created_at":, И диапазон дат, который я ищу, - с 17 июля 2016 года по 8 ноября 2016 года.

Пример интереса (не по дате):

}, 
            "created_at": "Wed Dec 14 22:34:28 +0000 2016", 
            "retweeted": false, 
            "coordinates": null, 
            "in_reply_to_user_id_str": null, 
            "source": "<a href=\"https://ifttt.com\" rel=\"nofollow\">IFTTT</a>", 
            "in_reply_to_status_id_str": null, 
            "in_reply_to_screen_name": null, 
            "in_reply_to_user_id": null, 
            "extended_entities": {

1 ответ

Чтобы ответить на ваш первый вопрос: выражение 2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00)) это просто регулярное выражение, соответствующие строки, которые начинаются с 2с последующим либо 1:AB:CDгде A и C - цифры от 0 до 5, а B и D - от 0 до 9 или 2:AB:CDгде A - это цифра от 0 до 2, C - это цифра от 0 до 5, а B и D - это цифры от 0 до 9, или 2:30:00, Это очень грубый способ сопоставить все время между 21:00:00 а также 22:30:00включительно. Написание такого регулярного выражения для сопоставления дат или времени между произвольной начальной и конечной точкой было бы очень утомительным упражнением.

Ссылка на ваш файл JSON больше не активна, но я постараюсь ответить на ваш главный вопрос на основе предоставленной вами информации. Кстати, ваш оригинал grep Команда немного противоречива, так как вы даете оба варианта -n (печатать номера строк) и -c (выводить только количество совпадений строк), которые являются взаимоисключающими. Поэтому я не совсем уверен, какую информацию вы хотите извлечь (номера строк или количество).

Вот команда, которая извлечет все строки, содержащие слова created_at и которые предшествуют строке, содержащей слова retweeted:

grep -rn -B1 'retweeted' * | grep 'created_at'

Идея состоит в том, что первый grep печатает каждую строку, соответствующую retweeted а также строка перед ним. Второй grep отфильтровывает строки, содержащие created_at,

Теперь у вас будет список всех дат с их номерами строк. Фильтрация диапазона дат сложнее; если вам нужно делать это редко, вы можете использовать регулярное выражение

grep -E '(July (1[7-9]|[23].)|August .*|September .*|October .*|November [1-8]), 2016'

для вашего конкретного диапазона дат (но чем сложнее диапазон, тем сложнее этот метод).

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