我正在尝试使用多个数组从文件中提取信息,然后echo
将该信息输出。
我的作业中的问题是:
•使用/ var / log / messages文件,要求用户输入服务名称(例如“syslogd”)并显示服务在特定日期重新启动的次数。
例如,如果服务在 2014年11月11日上重新 5 次,在 2014年11月12日时重新 3 次输出应类似于以下内容:
syslogd服务于11月10日重启5次,时间为:22:00:04
syslogd服务于11月11日重启3次,时间为: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
/ var / log / messages的输出:
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 :(得分: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.