У меня большой текстовый файл (почти 3 ГБ) - это файл журнала. Я хочу получить строки текста, которые соответствуют диапазону дат из этого файла, с 13 июля по 19 июля. Мой формат журнала:
2016-07-12 < ?xml version>
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
2016-07-20 < ?xml version>
sample text sample text
sample text sample text
sample text sample text
2016-07-20 < ?xml version>
sample text sample text
2016-07-20 < ?xml version>
поэтому после grep
/ sed
это должно быть выведено так:
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
Как я могу получить это?
command-line
grep
sed
Corey
источник
источник
Ответы:
С ,
grep
если вы знаете количество строк вы хотите , вы можете использовать опцию контекстной-A
печатать строки после шаблоначто даст вам строку с 2013-07-13 и следующие 3 строки
с помощью которых
sed
вы можете использовать даты, чтобы разграничить, как этокоторый напечатает все строки от первой строки с 2016-07-13 до и включая первую строку с 2016-07-19. Но это предполагает, что у вас есть только одна строка с 2016-07-19 (она не будет печатать следующую строку). Если есть несколько строк, используйте следующую дату и
d
удалите выходные данныеисточник
Этого простого grep одного лайнера будет достаточно:
Хорошо работает здесь и нет необходимости в седе :)
Ссылки:
источник
^
чтобы заставить его работать. Используя Mac.awk
решение:В основном печатает любую строку от той, которая начинается с
2016-07-13
той, которая начинается с2016-07-19
источник
Все остальные текущие ответы основаны на том факте, что записи файла журнала отсортированы в хронологическом порядке или на том факте, что диапазон дат можно легко сопоставить с регулярными выражениями. Если вам нужно более общее решение, нам нужно заняться программированием.
Я представляю этот скрипт GNU AWK:
Вы указываете время начала и окончания через переменные
starttime
иendtime
в формате, которыйmktime
понимает (YYYY MM DD hh dd ss
). Таким образом, вы запускаетеawk
команду следующим образом, предполагая, что приведенный выше скрипт Awk находится в исполняемом файлеfilter-log-dates.awk
в текущем рабочем каталоге, а файл журналаmylog.txt
:Обратите внимание, что время окончания является исключительным , то есть допустимые записи журнала должны иметь отметку времени до времени окончания.
Если формат вашей метки времени отличается, вы можете отрегулировать регулярное выражение, переданное
match
функции, в соответствии с ней.источник
Вы можете сделать это поэтапно. Найдите номер первой строки, соответствующий вашему стартовому шаблону. Найдите номер последней строки, соответствующий вашему шаблону окончания. Затем извлеките тест между этими двумя строками. Это можно сделать следующим образом.
Это может быть сделано все в
awk
команде, но шаги могут облегчить следовать. В awk переменная NR является текущим номером строки, и поскольку после шаблона не было задано никаких действий (NR> = 1234 && NR <= 5678), действием по умолчанию является печать строк, находящихся в этом диапазоне.источник