Анализ файла журнала с помощью bash-скрипта - PullRequest
0 голосов
/ 11 октября 2018

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

2018-09-09 15:32:28 Alert Server1 Running Check TRIGGERED
+--------------------------------------+---------+
| ID        | host           | altID     | value |
+--------------------------------------+---------+
| 4als4234  | host1.mail.com | isRunning | true  |
| 5nsh3463  | host2.mail.com | isRunning | false |
+--------------------------------------+---------+
Instance: server
Alert ID: server_running

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

host: host1.mail.com 
altID: isRunning
value: true 
Alert ID: server_running

host: host2.mail.com 
altID: isRunning
value: false 
AlertID: server_running

Я знаю Linux в целом, и мои знания bash-скриптинга ограничены.Я попытался использовать несколько команд awk, но мне кажется, что я не понимаю формат правильно.Какие-либо предложения?

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

С GNU awk:

gawk '
    /Alert.*TRIGGERED/ {alert_start = NR}
    alert_start && NR == alert_start + 4 { # the first data row of the table
        while (NF == 9) {
            ids[$2]["host"]  = $4
            ids[$2]["altID"] = $6
            ids[$2]["value"] = $8
            getline
        }
    }
    alert_start && /^Alert ID/ {
        for (id in ids)
            printf "host: %s\naltID: %s\nvalue: %s\nAlert ID: %s\n\n",
                ids[id]["host"], ids[id]["altID"], ids[id]["value"], $3
        delete ids
        alert_start = 0
    }
' log.file
0 голосов
/ 13 октября 2018

В комментарии вы сказали, что требование Alert-ID 'server1_running" instead of 4als4234 было опечаткой.
Насколько я вижу в требованиях, что-то будет работать как

grep -E "true|false" inputfile |
   while read -r _ id _ host _ altID _ value _; do
      cat <<@
host: ${host}
altID: ${altID}
value: ${value}
Alert id: ${id}

@
   done

Это даст вывод

host: host1.mail.com
altID: isRunning
value: true
Alert id: 4als4234

host: host2.mail.com
altID: isRunning
value: false
Alert id: 5nsh3463
0 голосов
/ 11 октября 2018

Проверьте это решение Perl:

$ cat alert.pl
open $INPUT,"<","$ARGV[0]" or die "No such file";
my $alertid ="";
while(my $row = <$INPUT>)
{
 if ($row=~m/^[|]\s*\d/m)
   {
     my @F = split(/\|/, $row);
     push @ht,"$F[2]";push @alt,"$F[3]";push @val,"$F[4]";
   }
 if ($row=~m/^Alert/m)
   {
     ($alertid = $row)=~s/(.*):(.*)/\2/g;
   }
}
foreach my $id (0..1)
{
print "host:$ht[$id]\n" ;
print "altID:$alt[$id]\n" ;
print "value:$val[$id]\n" ;
print "AlertID:${alertid}\n" ;
}
$ perl -f alert.pl alert.log  // Calling the perl script
host: host1.mail.com
altID: isRunning
value: true
AlertID: server_running

host: host2.mail.com
altID: isRunning
value: false
AlertID: server_running
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...