Хвост файл журнала с определенного номера строки
Я знаю, как привязать текстовый файл с определенным количеством строк,
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