【问题标题】:Extracting information form multiple arrays从多个数组中提取信息
【发布时间】:2014-11-29 21:57:32
【问题描述】:

我正在尝试使用多个数组从文件中提取信息,然后将echo 该信息提取出来。

我的作业中的问题是:

• 使用 /var/log/messages 文件,要求用户输入服务名称(例如“syslogd”)并显示服务在特定日期重新启动的次数。
例如,如果服务在 2014 年 11 月 11 日重新启动 5 次,在 2014 年 11 月 12 日重新启动 3 次,您的输出应类似于以下内容:

11月10日syslogd服务重启5次,时间为:22:00:04

11月11日syslogd服务重启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

输出还有更多内容,但我认为您明白了!如您所见,它输出的是所有日期,而不是每行一个。我不知道如何解决这个问题。请帮忙!!!

【问题讨论】:

  • 你能提供一些来自/var/log/messages的示例行吗?
  • 11 月 28 日 08:00:05 opentech syslogd:重新启动 11 月 28 日 22:00:04 opentech syslogd:重新启动 11 月 29 日 04:00:05 opentech syslogd:重新启动 11 月 29 日 20:00:05 opentech syslogd : 重启 Nov 29 22:00:07 opentech syslogd: 重启
  • array2 不是数组。
  • 那么就可以了。有没有办法把它变成一个数组?
  • 昨晚我在想我需要一个 for 循环,但我不知道如何将多个参数放入其中。我会修复 cut 命令。

标签: arrays linux bash shell unix


【解决方案1】:

如果您有兴趣,这里是一个有趣的 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.

【讨论】:

  • 我一直很感兴趣!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多