首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有重叠行的awk从多行会话/作业日志中提取数据

使用带有重叠行的awk从多行会话/作业日志中提取数据
EN

Stack Overflow用户
提问于 2016-11-12 03:35:43
回答 2查看 35关注 0票数 0

假设我有一个大型日志文件,类似于以下内容:

代码语言:javascript
复制
[2016-11-11 16:41:06.062] <sid:111> start1
[2016-11-11 16:41:06.062] <sid:111> op <555>
[2016-11-11 16:41:06.063] <sid:111> op <666>
[2016-11-11 16:41:07.124] <sid:222> start1
[2016-11-11 16:41:07.125] <sid:111> end
[2016-11-11 16:41:07.123] <sid:222> op <777>
[2016-11-11 16:41:08.333] <sid:333> start2
[2016-11-11 16:41:08.352] <sid:333> op <888>
[2016-11-11 16:41:08.352] <sid:333> op <999>
[2016-11-11 16:41:09.062] <sid:333> end
[2016-11-11 16:41:09.100] <sid:222> op <222>
[2016-11-11 16:41:09.100] <sid:222> op <333>
[2016-11-11 16:41:09.100] <sid:222> end

假设我需要知道以start1开头的每个会话的start1号是多少?

代码语言:javascript
复制
<sid:111> <555>
<sid:111> <666>
<sid:222> <777>
<sid:222> <222>
<sid:222> <333>

当并发会话很有可能并行执行,并且行不是全部在一起时,我如何使用awk (或其他任何东西)来做到这一点。

我尝试使用以下awk脚本:

代码语言:javascript
复制
awk '
    BEGIN {
        seen_start = 0;
        seen_end = 1;
    }
    !seen_start && seen_end && $0 ~ /start1/ {
        match($0, "(<sid:[a-f0-9]+>) start1", m);
        sid = m[1];
        seen_start = 1;
        seen_end = 0;
    }
    seen_start && !seen_end && $0 ~ sid && $0 ~ /op/ {
        match($0, "op (<[0-9]+>)", m);
        print sid, m[1];
    }
    seen_start && !seen_end && $0 ~ sid && $0 ~ /end/ {
        seen_start = 0;
        seen_end = 1;
    }
' test

但是,我想念从另一次会议开始的会议。

代码语言:javascript
复制
<sid:111> <555>
<sid:111> <666>

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-12 04:10:40

最后我使用了perl

代码语言:javascript
复制
#!/usr/bin/perl

my %hash;
while (<>) {
    if (/(<sid:[a-f0-9]+>) start1/) {
        $hash{$1} = 1;
    }
    elsif (/(<sid:[a-f0-9]+>) op (<[0-9]+>)/) {
        if (exists $hash{$1}) {
            print "$1 $2\n";
        }
    }
    elsif (/(<sid:[a-f0-9]+>) end/) {
        if (exists $hash{$1}) {
            delete $hash{$1};
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-11-12 03:54:55

awk单线

代码语言:javascript
复制
awk -F '[:<>]' '/start1/ {a[$5]; next} /end/ {delete a[$5]; next} /op/ && $5 in a {print $5, $7}' test

解释

代码语言:javascript
复制
awk -F '[:<>]' '                  # Split on either :, < or >
    /start1/ {a[$5]; next}        # Note that the session has started
    /end/ {delete a[$5]; next}    # note session ended
    /op/ && $5 in a {             # print if session has started
        print $5, $7
    }
'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40559320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档