2014-11-29 5 views
-1

Я пытаюсь использовать несколько массивов для извлечения информации из файла, а затем echo эту информацию.Извлечение информации из нескольких массивов

Вопрос от моей домашней работы является:

• Используйте/вар/Журнал/сообщений файл, попросите пользователя ввести имя службы (., Например, «SyslogD») и отображать количество раз службы перезапущен на определенную дату.
Так, например, если служба перезапущен раз на 11 ноября 2014 и раз на 12 ноября 2014 результат должен выглядеть следующим образом:

Служба Syslogd перезапущен 5 раз 10 ноября, время являются: 22:00:04

Syslogd служба перезапуске 3 раза по 11 ноября, время являются: 22:00:04

Мой код:

echo -n "Enter the name of the service you wish to log: "; read input 
array1=($(grep $input /var/log/messages | awk '{print $1,$2}' | uniq -c | cut -d ' ' -f 4)) 
array2=$(grep $input /var/log/messages | awk '{print $1,$2}' | uniq | tr -d " ") 

for element in "${array1[@]}" 
do 
    for elementTwo in "${array2[@]}" 
    do 
     echo "The "$input" service restarted "$element" times on"$elementTwo" " 
    done 
done 

Мой вывод:

Enter the name of the service you wish to log: syslogd 

The syslogd service restarted 2 times onOct30 Oct31 Nov1 Nov2 Nov3 Nov4 Nov5 Nov6 Nov7 Nov8 Nov9    Nov10 Nov11 Nov12 Nov13 Nov14 Nov15 Nov16 Nov17 Nov18 Nov19 Nov20 Nov21 Nov22 Nov23 Nov24 Nov25 Nov26 Nov27 Nov28 Nov29 

The syslogd service restarted 2 times onOct30 Oct31 Nov1 Nov2 Nov3 Nov4 Nov5 Nov6 Nov7 Nov8 Nov9 Nov10 Nov11 Nov12 Nov13 Nov14 Nov15 Nov16 Nov17 Nov18 Nov19 Nov20 Nov21 Nov22 Nov23 Nov24 Nov25 Nov26 Nov27 Nov28 Nov29 

The syslogd service restarted 3 times onOct30 Oct31 Nov1 Nov2 Nov3 Nov4 Nov5 Nov6 Nov7 Nov8 Nov9 Nov10 Nov11 Nov12 Nov13 Nov14 Nov15 Nov16 Nov17 Nov18 Nov19 Nov20 Nov21 Nov22 Nov23 Nov24 Nov25 Nov26 Nov27 Nov28 Nov29 

Выход из/вар/Журнал/сообщений:

Nov 28 08:00:05 opentech syslogd: restart 
Nov 28 22:00:04 opentech syslogd: restart 
Nov 29 04:00:05 opentech syslogd: restart 
Nov 29 20:00:05 opentech syslogd: restart 
Nov 29 22:00:07 opentech syslogd: restart 

Существует еще к выходу, но я думаю, вы понимаете! Как вы видите, это выводит все даты вместо одной строки. Я не знаю, как это исправить. Пожалуйста помоги!!!

+0

Можете ли вы дать несколько образцов линий из '/ var/log/messages'? –

+1

28 ноября 08:00:05 opentech syslogd: restart 28 ноя 22:00:04 opentech syslogd: restart 29 ноября 04:00:05 opentech syslogd: restart 29 ноября 20:00:05 opentech syslogd: restart Nov 29 22:00:07 opentech syslogd: restart – msw

+1

'array2' не является массивом. – Mat

ответ

0

Вот скрипт на Perl для удовольствия, если вы заинтересованы:

#! /usr/bin/env perl 
use warnings; 
use strict; 

my $service=shift; 
my %h; 
open (my $fh, "<", '/var/log/messages') or die "Could not open log file: $!\n"; 
while (<$fh>) { 
    if (/$service.*restart/) { 
     my($f1,$f2,$f3)=split; 
     my $key="$f1 $f2"; 
     $h{$key}{cnt}++; 
     if (exists $h{$key}{arr}) { 
      push (@{$h{$key}{arr}}, $f3); 
     } else { 
      $h{$key}{arr}=[$f3]; 
     } 
    } 
} 
close($fh); 

for (sort keys %h) { 
    print "The $service service restarted " . $h{$_}{cnt} . " times on " . 
     $_ . ". The times are: " . join (", ", @{$h{$_}{arr}}) . ".\n"; 
} 

Вы запустите его с помощью:

$ script.pl syslogd 

Выход:

The syslogd service restarted 2 times on Nov 28. The times are: 08:00:05, 22:00:04. 
The syslogd service restarted 3 times on Nov 29. The times are: 04:00:05, 20:00:05, 22:00:07. 
+0

Мне всегда интересно! спасибо – msw

Смежные вопросы