хвост файл журнала с определенного номера строки - PullRequest
0 голосов
/ 14 декабря 2018

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

tail -n50 /this/is/my.log

Однако как мне сделать так, чтобы количество строк было переменной?

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

Day Mon YY HH:MM:SS

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

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

Возможно ли это?

Ответы [ 4 ]

0 голосов
/ 14 декабря 2018

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

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
0 голосов
/ 14 декабря 2018

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

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

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

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

0 голосов
/ 14 декабря 2018

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

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

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

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

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

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

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

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

0 голосов
/ 14 декабря 2018

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

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

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

...