我正在尝试使用多个数组从文件中提取信息,然后回显
该信息。
我作业中的问题是:
• 使用/var/log/messages 文件,要求用户输入服务名称(例如“syslogd”)并显示特定日期内服务重新启动的次数。
因此,例如,如果服务在 2014 年 11 月 11 日重新启动 5 次,并在 2014 年 11 月 12 日重新启动 3 次,则您的输出应类似于以下内容:
The syslogd service restarted 5 times on Nov 10, the times are: 22:00:04
The syslogd service restarted 3 times on Nov 11, the times are: 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
输出还有更多内容,但我想您明白了!正如您所看到的,它输出所有日期,而不是每行一个。我不知道如何解决这个问题。请帮忙!!!
最佳答案
如果您有兴趣,这里有一个有趣的 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.
关于arrays - 从多个数组中提取信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27207607/