Мне нужно рассчитать разницу во времени между двумя сообщениями журнала / var / log / messages. Поскольку мы знаем сообщения журнала с префиксом даты и времени, мне нужна разница во времени между двумя записями журнала.
В bash, как только вы выясните, какую дату / время вы хотите использовать, вы можете написать
firsttime="Jun 1 02:00:13"
secondtime="Jun 1 03:00:46"
echo $(( $(date -d "$secondtime" +"%s") - $(date -d "$firsttime" +"%s") ))
Это даст вам количество секунд между этими двумя моментами. Если вы хотите автоматизировать поиск в первый и второй раз, вам нужно будет сообщить нам, что именно вы ищете в журнале.
Я выбрал первое и последнее сообщения в /var/log/messages
чтобы продемонстрировать, вам придется изменить его, чтобы получить собственное время начала и окончания
#!/bin/bash
start=$(head -n 1 /var/log/messages | awk {'print $1, $2,$3'})
finish=$(tail -n 1 /var/log/messages | awk {'print $1, $2,$3'})
start_secs=$(date -d "$start" +"%s")
finish_secs=$(date -d "$finish" +"%s")
let diff_secs=($finish_secs - $start_secs)
let days=$diff_secs/86400
let remainder=$diff_secs%86400
let hours=$remainder/3600
let remainder=$remainder%3600
let minutes=$remainder/60
let seconds=$remainder%60
echo "Days = $days, Hours = $hours, Minutes = $minutes, Seconds = $seconds"
Я предполагаю, что вы хотите найти самый большой промежуток времени между двумя последовательными сообщениями журнала. Если это так, см. Ниже сценарий, который должен помочь. Я написал этот скрипт пару лет назад, чтобы распечатать определенный временной диапазон из файла сообщений, и его было довольно легко настроить:
#!/usr/bin/perl -W
use strict;
use Time::Local;
my %MONTHS = ( "Jan" => 0, "Feb" => 1, "Mar" => 2, "Apr" => 3, "May" => 4, "Jun" => 5,
"Jul" => 6, "Aug" => 7, "Sep" => 8, "Oct" => 9, "Nov" => 10, "Dec" => 11 );
# Messages file doesn't include the year, so we need to assume that
# all messages are less than a year old and make some guesses
my $currenttime = time();
my $currentyear = (localtime($currenttime))[5];
my $currentmonth = (localtime($currenttime))[4];
my $largestgap;
my $largestgapbefore;
my $largestgapafter;
my $lasttime;
my $lastmsg;
open(FILE, "</var/log/messages") || die "Unable to open messages file: $!\n";
while(<FILE>) {
chomp;
/^(...) (..) (..):(..):(..)/;
my $year = $currentyear;
if($MONTHS{$1} > $currentmonth) {$year -= 1; }
my $time = timelocal($5, $4, $3, $2, $MONTHS{$1}, $year);
if(defined($lasttime)) {
my $gap = $time - $lasttime;
if(!defined($largestgap) || $gap > $largestgap) {
$largestgap = $gap;
$largestgapbefore = $lastmsg;
$largestgapafter = $_;
}
}
$lasttime = $time;
$lastmsg = $_;
}
close(FILE);
if(!defined($lasttime)) {
print "No entries in log file.\n";
exit;
}
print "Largest gap was: " . $largestgap . " seconds.\n";
print "Entry before the gap: " . $largestgapbefore . "\n";
print " Entry after the gap: " . $largestgapafter . "\n";