arrays - 从多个数组中提取信息

标签 arrays linux bash shell unix

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

我作业中的问题是:

• 使用/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/

相关文章:

java - 如何读取数组中的字符输入?

linux - 如果不使用 eval,是否可以在 shell 脚本中执行命令注入(inject)?

linux - 意外标记附近的 Bash 语法错误 `done' vi 编辑器以红色突出显示

c - realloc 无法从其他函数访问新大小

c - 指针递增

java - 如何用数组制作基于控制台的菜单?

php - yii应用地址

linux - 如何将两个单词添加到 bash 脚本变量

linux - 从当前文件夹中的 Finder/Browser 执行 Mac/Linux shell 脚本

mysql - 数据库自动创建bash脚本: What's wrong?