Хвост файл журнала с определенного номера строки

Я знаю, как привязать текстовый файл с определенным количеством строк,

tail -n50 /this/is/my.log

Тем не менее, как я могу сделать эту строку считать переменную?

Допустим, у меня есть большой файл журнала, который ежедневно добавляется какой-либо программой, все строки в файле журнала начинаются с даты и времени в следующем формате:

Day Mon YY HH:MM:SS

Каждый день я хочу выводить хвост файла журнала, но только для записей предыдущих дней. Допустим, этот выходной идет сразу после полуночи, я не волнуюсь о том, что хвост распадется на следующий день.

Я просто хочу иметь возможность определить, сколько строк выстроить в хвост, основываясь на первом появлении вчерашней даты...

Это возможно?

4 ответа

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

  • Для хвоста используйте -n +num для номера строки num начать с
  • Для головы используйте -n -num по количеству строк не печатать

Это относится к актуальному вопросу, если вы запомнили количество строк за предыдущий раз, когда выполнили команду, а затем использовали это число для tail -n +$prevlines чтобы получить следующую часть частичного журнала, независимо от того, как часто проверяется журнал.

Отвечая на фактический вопрос, можно распечатать все после определенной строки, которую вы можете ввести, используя опцию -A со смешным счетом. Это может быть более полезным, чем другие ответы здесь, так как вы можете получить несколько дней результатов. Итак, чтобы получить все со вчерашнего дня и до сегодняшнего дня:

grep "^`date -d yesterday '+%d %b %y'`" -A1000000 log_file.txt

Вы можете комбинировать 2 greps для печати между 2 диапазонами дат.

Обратите внимание, что это зависит от даты, которая фактически появляется в файле журнала. У него есть слабость в том, что если в определенный день, используемый в качестве маркера диапазона, не было зарегистрировано ни одного события, он ничего не сможет найти.

Чтобы решить эту проблему, вы можете ввести фиктивные записи для начальной и конечной дат и отсортировать файл перед очисткой. Это, вероятно, излишне, и сортировка может быть дорогой, поэтому я не буду приводить пример.

Я не думаю, что у tail есть какая-то функциональность, подобная этой.

Вы можете определить начальные и конечные номера строк с помощью awk, но если вы просто хотите получить эти строки из файла журнала, самый простой способ - использовать grep в сочетании с датой для этого. Соответствие вчерашней даты в начале строки должно работать:

grep "^`date -d yesterday '+%d %b %y'`" < log_file.txt

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

Вы можете сделать это без хвоста, просто grep строк с предыдущей датой:

кошка my.log | grep "$( date -d " вчера 13:00"+%d %m %Y')"

И если вам нужно количество строк, вы можете добавить | туалет

Я решил это методом проб и ошибок, получив номера строк для первой строки, содержащие дату и общее количество строк, следующим образом:

lines=$(wc -l < myfile.log)

start=$(cat myfile.log | grep -no $datestring | head -n1 | cut -f1 -d:)

n=$((lines-start))

а затем хвост, исходя из этого:

tail -n$n myfile.log
Другие вопросы по тегам