Как я могу выбрать строки из своих текстовых файлов, подобных этому
"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
ОБНОВЛЕНИЕ: Я ищу имена файлов, которые содержат этот шаблон в них.
Если это могло бы быть где-нибудь в строке, и что-либо могло бы быть промежуточным, я предполагаю
grep -wirn 'Wed Oct 19 .* 2016' *
, должен получить его...
, Если Вы только хотите имена файлов, используйте -l
grep -wirl 'Wed Oct 19 .* 2016' *
-w
границы слова использования в случае, если текст, который Вы хотите, застревает на что-то еще, чему мы не хотим соответствовать (вряд ли в этом случае) -l
, просто печатают имена файлов файлов, которые содержат соответствие .*
любое количество любых символов здесь , нормально, вероятно, анализировать этот файл с grep
специально для чего-то столь простого, но usinga JSON синтаксический анализатор, как упомянутый в ответ David Foerster является Правильным Путем (т.е. это, вероятно, будет более надежно, особенно если необходимо сделать что-либо сложное).
Этот grep должен смочь выбрать требуемые строки:
grep -E ".*Wed Oct 19.*2016$" reg.txt
Для поиска файлов и имени файла только:
grep -Erl ".*Wed Oct 19.*2016$" /path/to/folders/to/search
Так как Вы работаете над данными 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 (или позже) репозитории в одноименном пакете.