шаблоны grepping в json-файле

Это не имеет никакого значения в любом случае.

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

9 ответов

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

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

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

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

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

Примечания

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

Вероятно, правильно разобрать этот файл с помощью grep специально для чего-то такого простого, но использование парсера JSON, как упоминалось в ответе Дэвида Фёрстера, - это правильный путь (то есть, скорее всего, он будет более надежным, особенно если вам нужно что-то сделать сложным).

3
ответ дан 22 May 2018 в 18:05
  • 1
    холодные бобы! Это работает! Благодаря! – Mona Jalal 27 September 2017 в 01:07
  • 2
    Из любопытства вы можете посоветовать использовать grep для выбора твитов между 20:30:00 и 22:00:00? Я не уверен, что это возможно. Благодаря! " created_at ":" Wed Oct 19 18:58:40 +0000 2016 ", – Mona Jalal 27 September 2017 в 01:16
  • 3
    @MonaJalal, предполагая, что времена могут возникать в любом месте файла, я сомневаюсь, что grep может это сделать (но если вы зададите новый вопрос об этом, возможно, я ошибаюсь). Вам нужна программа, которая понимает числа, возможно awk или perl. Я рекомендую задать вопрос об этом :) – Zanna 27 September 2017 в 01:21
  • 4
    вы имеете в виду парсер json в bash или внутри Python? можете ли вы назвать его? Существует огромное количество файлов, поэтому я задаюсь вопросом, может ли Python быть масштабируемым вообще! – Mona Jalal 27 September 2017 в 03:28
  • 5
    Я не знаю, как использовать любой @MonaJalal :( Когда я пытаюсь, я всегда получаю ошибки – Zanna 27 September 2017 в 07:44

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

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

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

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

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

Примечания

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

Вероятно, правильно разобрать этот файл с помощью grep специально для чего-то такого простого, но использование парсера JSON, как упоминалось в ответе Дэвида Фёрстера, - это правильный путь (то есть, скорее всего, он будет более надежным, особенно если вам нужно что-то сделать сложным).

3
ответ дан 18 July 2018 в 06:11

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

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

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

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

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

Примечания

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

Вероятно, правильно разобрать этот файл с помощью grep специально для чего-то такого простого, но использование парсера JSON, как упоминалось в ответе Дэвида Фёрстера, - это правильный путь (т. е. он, вероятно, будет более надежным, особенно если вам нужно что-либо сделать сложным).

3
ответ дан 24 July 2018 в 18:32

Поскольку вы работаете над данными 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 Script, который включает непустые строки, но не 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
ответ дан 22 May 2018 в 18:05

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

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

Искать файлы и выводить только имя файла:

grep -Erl ".*Wed Oct 19.*2016$" /path/to/folders/to/search
0
ответ дан 22 May 2018 в 18:05
  • 1
    Хорошо все еще работает над этим – George Udosen 26 September 2017 в 19:33
  • 2
    это кажется неработоспособным. Я запускаю его в папке, содержащей папки, каждая из которых имеет твиты в формате json. (venv) [jalal @ ivcgpu3 input_tweets] $ ls t3 t4 t5 t6 t7 t8 (venv) [jalal @ ivcgpu3 input_tweets] $ grep -E -r "^ created_at. * \ s {1,} Wed Oct 19. * 2016 $ & Quot; ^ Z [8] + Остановлен grep --color = auto -E -r "^ created_at. * \ S {1,} Wed Oct 19. * 2016 $ " – Mona Jalal 27 September 2017 в 01:06
  • 3
    @ Zanna, который дал образец OP, даже не содержит 2016, и как проверить результат grep? – George Udosen 27 September 2017 в 01:30
  • 4
    Наверное, поэтому в своем ответе я говорю «должен его получить». Я создал поддельный образец, основанный на описании OP (который, я думаю, я понял достаточно хорошо) и файловой структуре, чтобы проверить и убедиться, что в нем есть какие-то неприятные вещи. Но спрос настолько прост, что я все равно испытывал только свою совесть. Иногда с обработкой текста я хочу протестировать на чем-то менее последовательном, чем данный образец, основанный на описании, поэтому я создаю более крупный образец в любом случае с некоторыми сложными вещами, так что это довольно нормально – Zanna 27 September 2017 в 07:43
  • 5
    Ye @ Zanna Я сделал то же самое, но, по-видимому, мне OP было не очень понятно. – George Udosen 27 September 2017 в 08:10

Поскольку вы работаете над данными 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 Script, который включает непустые строки, но не 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
ответ дан 18 July 2018 в 06:11

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

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

Искать файлы и выводить только имя файла:

grep -Erl ".*Wed Oct 19.*2016$" /path/to/folders/to/search
0
ответ дан 18 July 2018 в 06:11

Поскольку вы работаете над данными 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 Script, который включает непустые строки, но не 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
ответ дан 24 July 2018 в 18:32

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

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

Искать файлы и выводить только имя файла:

grep -Erl ".*Wed Oct 19.*2016$" /path/to/folders/to/search
0
ответ дан 24 July 2018 в 18:32
  • 1
    Хорошо все еще работает над этим – George Udosen 26 September 2017 в 19:33
  • 2
    это кажется неработоспособным. Я запускаю его в папке, содержащей папки, каждая из которых имеет твиты в формате json. (venv) [jalal @ ivcgpu3 input_tweets] $ ls t3 t4 t5 t6 t7 t8 (venv) [jalal @ ivcgpu3 input_tweets] $ grep -E -r "^ created_at. * \ s {1,} Wed Oct 19. * 2016 $ & Quot; ^ Z [8] + Остановлен grep --color = auto -E -r "^ created_at. * \ S {1,} Wed Oct 19. * 2016 $ & quot; – Mona Jalal 27 September 2017 в 01:06
  • 3
    @ Zanna, который дал образец OP, даже не содержит 2016, и как проверить результат grep? – George Udosen 27 September 2017 в 01:30
  • 4
    Ye @ Zanna Я сделал то же самое, но, по-видимому, мне OP было не очень понятно. – George Udosen 27 September 2017 в 08:10

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

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