У меня есть большая сумма 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 для "created_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": {
Отвечать на Ваш первый вопрос: выражение 2(1:[0-5][0-9]:[0-5][0-9]|2:([0-2][0-9]:[0-5][0-9]|30:00))
просто регулярное выражение, соответствующие строки, которые запускаются с a 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'
для Вашего конкретного диапазона дат (но чем более сложный диапазон, тем тяжелее этот метод добирается).