захват шаблонов в json файле

Как я могу выбрать строки из своих текстовых файлов, подобных этому

"created_at": "Wed Oct 19 12:36:54 +0000 2016"

в основном я должен найти строки с шаблоном

  • запускается с Wed Oct 19 и
  • концы с 2016

Однако Wed Oct 19 12:36:54 +0000 2016 мог быть где угодно в строке, и любое другое время суток могло быть промежуточным.

Когда я использую

grep -irn "Wed Oct 19" | grep -irn "2016"

Я получаю все виды нежелательных результатов.

Вот пример подобной строки из файла, которому я не хочу соответствовать:

"created_at": "Tue Jan 31 18:50:26 +0000 2012",

Thid является частью атрибутов твита.

Вот более длинная часть входа:

 "contributors": null, 
      "retweeted": false, 
      "in_reply_to_user_id_str": null, 
      "place": null, 
      "retweet_count": 4, 
      "created_at": "Sun Apr 03 23:48:36 +0000 2011", 
      "retweeted_status": {
            "text": "In preparation for the NFL lockout, I will be spending twice as much time analyzing my fantasy baseball team during company time. #PGP", 
            "truncated": false, 
            "in_reply_to_user_id": null, 
            "in_reply_to_status_id": null, 

полный вход в качестве примера здесь: https://gist.github.com/hrp/900964

ОБНОВЛЕНИЕ: Я ищу имена файлов, которые содержат этот шаблон в них.

2
задан 27 September 2017 в 01:27

3 ответа

Если это могло бы быть где-нибудь в строке, и что-либо могло бы быть промежуточным, я предполагаю

grep -wirn 'Wed Oct 19 .* 2016' *

, должен получить его...

, Если Вы только хотите имена файлов, используйте -l

grep -wirl 'Wed Oct 19 .* 2016' *

Примечания

  • -w границы слова использования в случае, если текст, который Вы хотите, застревает на что-то еще, чему мы не хотим соответствовать (вряд ли в этом случае)
  • -l, просто печатают имена файлов файлов, которые содержат соответствие
  • .* любое количество любых символов здесь

, нормально, вероятно, анализировать этот файл с grep специально для чего-то столь простого, но usinga JSON синтаксический анализатор, как упомянутый в ответ David Foerster является Правильным Путем (т.е. это, вероятно, будет более надежно, особенно если необходимо сделать что-либо сложное).

3
ответ дан 2 December 2019 в 02:14

Этот grep должен смочь выбрать требуемые строки:

grep -E ".*Wed Oct 19.*2016$" reg.txt

Для поиска файлов и имени файла только:

grep -Erl ".*Wed Oct 19.*2016$" /path/to/folders/to/search
0
ответ дан 2 December 2019 в 02:14

Так как Вы работаете над данными JSON, я использовал бы фактический синтаксический анализатор JSON:

LC_TIME=POSIX jq \
  --argjson year 2016 --argjson month 10 --argjson day 19 \
  --arg timefmt '%a %b %d %T %z %Y' \
  '.. | .created_at? | select(.) | strptime($timefmt) | select(.[0] == $year and .[1] + 1 == $month and .[2] == $day) | strftime($timefmt)' \
  twitter.json
  • --arg и --argjson установите именованные переменные, используемые всюду по этому jq сценарию.

  • .. возвраты все рекурсивно вложенные объекты.

  • .created_at? возвращает значение записи с ключом created_at при наличии или null иначе.

  • select(.) возвраты только оценивают, которые являются “истиной-y” в Сценарии ECMA, который включает непустые строки, но нет null.

  • strptime($timefmt) анализирует строку даты и времени согласно strptime(3) и возвращает кортеж “сломанных” значений даты и времени.

  • select(.[0] == $year and .[1] + 1 == $month and .[2] == $day) возвраты только оценивают, для которого данное выражение оценивает как верное, в этом случае где значения переменных $year, $month, и $day соответствуйте их соответствующим записям кортежа даты и времени.

  • strftime($timefmt) возвращает кортеж даты и времени, отформатированный как строка согласно strftime(3)

Это требует jq v1.5 или позже как доступного в Ubuntu Xenial (или позже) репозитории в одноименном пакете.

1
ответ дан 2 December 2019 в 02:14

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

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