首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用bash脚本解析日志文件

使用bash脚本解析日志文件
EN

Stack Overflow用户
提问于 2018-10-11 19:41:37
回答 3查看 934关注 0票数 0

下面是我试图解析的一个日志文件的示例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2018-09-09 15:32:28 Alert Server1 Running Check TRIGGERED
+--------------------------------------+---------+
| ID        | host           | altID     | value |
+--------------------------------------+---------+
| 4als4234  | host1.mail.com | isRunning | true  |
| 5nsh3463  | host2.mail.com | isRunning | false |
+--------------------------------------+---------+
Instance: server
Alert ID: server_running

我想有一个脚本,运行和格式的日志如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
host: host1.mail.com 
altID: isRunning
value: true 
Alert ID: server_running

host: host2.mail.com 
altID: isRunning
value: false 
AlertID: server_running

我对linux有一般的了解,我的bash脚本知识有限。我尝试过使用一些awk命令,但是我似乎不能得到正确的格式。有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2018-10-11 20:40:10

检查此Perl解决方案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ cat alert.pl
open $INPUT,"<","$ARGV[0]" or die "No such file";
my $alertid ="";
while(my $row = <$INPUT>)
{
 if ($row=~m/^[|]\s*\d/m)
   {
     my @F = split(/\|/, $row);
     push @ht,"$F[2]";push @alt,"$F[3]";push @val,"$F[4]";
   }
 if ($row=~m/^Alert/m)
   {
     ($alertid = $row)=~s/(.*):(.*)/\2/g;
   }
}
foreach my $id (0..1)
{
print "host:$ht[$id]\n" ;
print "altID:$alt[$id]\n" ;
print "value:$val[$id]\n" ;
print "AlertID:${alertid}\n" ;
}
$ perl -f alert.pl alert.log  // Calling the perl script
host: host1.mail.com
altID: isRunning
value: true
AlertID: server_running

host: host2.mail.com
altID: isRunning
value: false
AlertID: server_running
票数 0
EN

Stack Overflow用户

发布于 2018-10-11 20:55:02

使用GNU awk:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gawk '
    /Alert.*TRIGGERED/ {alert_start = NR}
    alert_start && NR == alert_start + 4 { # the first data row of the table
        while (NF == 9) {
            ids[$2]["host"]  = $4
            ids[$2]["altID"] = $6
            ids[$2]["value"] = $8
            getline
        }
    }
    alert_start && /^Alert ID/ {
        for (id in ids)
            printf "host: %s\naltID: %s\nvalue: %s\nAlert ID: %s\n\n",
                ids[id]["host"], ids[id]["altID"], ids[id]["value"], $3
        delete ids
        alert_start = 0
    }
' log.file
票数 0
EN

Stack Overflow用户

发布于 2018-10-12 21:21:10

在一条评论中,您说需求Alert-ID 'server1_running" instead of 4als4234是一个打字错误。

据我所知,在需求中会有一些东西是这样工作的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
grep -E "true|false" inputfile |
   while read -r _ id _ host _ altID _ value _; do
      cat <<@
host: ${host}
altID: ${altID}
value: ${value}
Alert id: ${id}

@
   done

这将给出输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
host: host1.mail.com
altID: isRunning
value: true
Alert id: 4als4234

host: host2.mail.com
altID: isRunning
value: false
Alert id: 5nsh3463
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52767761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文