Intereting Posts
Изменить имена файлов в Makefile Проблема установки Fedora 23 в VM с использованием KVM на Linux Mint 17.2 Linux: Почему init и systemd используют так много операций ввода-вывода? как печатать, если строка содержит определенный шаблон и не печатать, если она не содержит шаблон Как заменить текст после местоположения курсора в VIM Как вызвать действие в условиях низкой памяти в Linux? libdvbv5 – как добавить поддержку стандарта KU-CIRCULAR? Поддерживает ли GNOME 3 увеличение рабочего стола? OpenSSH отказался от каталога .ssh с символической ссылкой Какой самый безопасный способ получить права root: sudo, su или login? Шифрование и обфускация имен файлов Как удалить неисправные драйверы графического процессора Ubuntu 18.04 Найти в тексте все слова, которые появляются 10 или более раз ldd: не удается найти библиотеку для xl c скомпилированной двоичной, но может для gcc скомпилированных двоичных файлов в AIX Есть ли инструмент, который вставляет из буфера обмена один символ за раз?

grep файл журнала, начиная с определенного времени и до конца файла

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

Мне нужно искать файл журнала, начиная с определенного времени до конца файла.

Например:

Starting point: July 29 2018 21:00:00 End point : end of file 

Я обеспокоен тем, что даже если шаблон от July 29 2018 21:00:00 не существует, я все же получаю линии между, например, July 29 2018 21:05:11 поскольку это все еще за пределами July 29 2018 21:00:00 .

Для этого работает awk или sed ?

Я бы использовал для этого perl, чтобы проанализировать отметку времени в каждой строке:

 $ cat file June 5 2018 00:00:00 do not print July 29 2018 20:59:59 do not print July 29 2018 21:00:00 print me July 29 2018 21:00:01 print me $ perl -MTime::Piece -sane ' BEGIN { $start = Time::Piece->strptime($startdate, "%B %e %Y %T"); } # the string "@F[0..3]" is the first 4 words on the line $time = Time::Piece->strptime("@F[0..3]", "%B %e %Y %T"); print if $time >= $start; ' -- -startdate="July 29 2018 21:00:00" file 
 July 29 2018 21:00:00 print me July 29 2018 21:00:01 print me 

Эта версия несколько более эффективна, так как перестает анализировать отметку времени после того, как начальная дата была замечена (предполагается, что файл находится в возрастающем хронологическом порядке):

 perl -MTime::Piece -sane ' BEGIN { $start = Time::Piece->strptime($startdate, "%B %e %Y %T"); } unless ($go) { $time = Time::Piece->strptime("@F[0..3]", "%B %e %Y %T"); $go = $time >= $start; } print if $go; ' -- -startdate="July 29 2018 21:00:00" file 

Попробуй это:

 grepfromdate() { readarray f < $1 fromdate=$(date +%s -d "$2") for (( lineno=${#f[@]}-1 ; lineno>=0; lineno-- )) ; do line=${f[$lineno]} time_from_line=$(echo "$line" | grep -o "^[AZ][az]* [0-9][0-9] [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]") [[ $(date +%s -d "$time_from_line") -gt $fromdate ]] && echo "$line" || break done | tac } 

Использование:
grepfromdate "filename" "July 29 2018 21:00:00"

Вы можете передать любой формат даты, который date может прочитать, например, 2018-07-01 . Если формат даты изменяется, вы можете изменить шаблон grep соответствии с этим.

Вы можете найти первую строку, соответствующую определенной строке (например, July 29 2018 21: все после 9 вечера). Если у вас есть этот номер строки, вы можете tail файл, начиная с найденного номера строки.

  $ man tail -n, --lines=[+]NUM output the last NUM lines, instead of the last 10; or use -n +NUM to output starting with line NUM 

мой пример:

 $ log=/var/log/syslog # get line number $ first_line=$(grep -no "Aug 14 08:" $log | tail -n1 | cut -d: -f1) # count the lines from $first_line to EOF $ tail -n +$first_line $log | wc -l 24071 # output the content starting with $first_line $ tail -n +$first_line $log # line count of the whole file: $ wc -l $log 70896 /var/log/syslog 

С помощью sed вы можете сделать

 sed -n '/July 29 2018 21:/,/$!d/p' file 

Это даст вам все строки между 29 июля 2018 года 21: ** и последней строкой файла