0

我有以下数据:

====>后台进程启动日志:HRBkg Hello on 2013/09/27 23:20:20 Log Level 3
09/27 23:20:20 I Background process is using processing model #: 3
09/27 23: 20:23 I
09/27 23:20:23 I -- 开始导入外部密钥
====> 为后台进程启动日志:HRBkg Hello on 2013/09/30 07:31:07 日志级别 3
09/30 07:31:07 I 后台进程正在使用处理模型#: 3
09/30 07:31:09 I
09/30 07:31:09 I -- 开始导入外部密钥

我需要在====> START LOG.....
的 LAST 匹配之后提取剩余的文件内容 我已经尝试过多次使用sed/ awk,但是,我似乎无法awk在我的正则表达式中使用变量。我试图包含的变量是日期(2013/09/30),因为这就是使该行独一无二的原因。
我在HP-UX机器上,无法使用grep -A

有什么建议吗?

4

8 回答 8

3

无需测试特定时间即可找到文件中的最后一个条目:

awk '
    BEGIN { ARGV[ARGC] = ARGV[ARGC-1]; ARGC++ }
    NR == FNR { if (/START LOG/) lastMatch=NR; next }
    FNR == lastMatch { found=1 }
    found
' file
于 2013-10-01T02:12:05.340 回答
1

这将返回您想要的输出。

sed -n '/START LOG/h;/START LOG/!H;$!b;x;p' file

如果你tac有空,你可以很容易地做到..

tac <file> | sed '/START LOG/q' | tac
于 2013-10-01T04:29:24.883 回答
1

这可能对您有用(GNU sed):

a=2013/09/30
sed '\|START LOG.*'"$a"'|{h;d};H;$!d;x' file
于 2013-10-01T04:16:34.343 回答
0

使用 GNU awk ( gawk) 或 Mikes awk ( mawk),您可以设置记录分隔符 ( RS),以便每条记录都包含一条完整的日志消息。所以你需要做的就是打印END块中的最后一个:

awk 'END { printf "%s", RS $0 }' RS='====> START LOG' infile

输出:

====> START LOG for Background Process: HRBkg Hello on 2013/09/30 07:31:07 Log Level 3
09/30 07:31:07 I Background process is using processing model #: 3
09/30 07:31:09 I
09/30 07:31:09 I -- Started Import for External Key
于 2013-10-01T11:39:52.177 回答
0

作为记录,您可以轻松地将变量与 Awk 中的正则表达式匹配,反之亦然。

awk -v date='2013/09/30' '$0 ~ date {p=1} p' file

如果输入行与日期匹配,则设置p为 1,如果p非零则打印。

(回想一下,Awk 中的一般形式是条件 { 动作 },其中动作块是可选的;如果省略,则默认动作是打印当前输入行。)

于 2013-10-01T03:57:19.030 回答
0

这是 Python 中的一个:

#!/usr/bin/python

import sys, re

for fn in sys.argv[1:]:
    with open(fn) as f:
        m=re.search(r'.*(^====> START LOG.*)',f.read(), re.S | re.M)
        if m:
            print m.group(1)

然后运行:

$ ./re.py /tmp/log.txt
====> START LOG for Background Process: HRBkg Hello on 2013/09/30 07:31:07 Log Level 3
09/30 07:31:07 I Background process is using processing model #: 3
09/30 07:31:09 I
09/30 07:31:09 I -- Started Import for External Key

如果要排除该====> START LOGS..位,请将正则表达式更改为:

r'.*(?:^====> START LOG.*?$\n)(.*)'

于 2013-10-01T02:31:45.560 回答
0

perl 中的答案:

如果您的日志在假设filelog.txt.

my @line;

open (LOG, "<filelog.txt") or "die could not open filelog.tx";

while(<LOG>) {
   @line = $_;
}

my $lengthline = $#line;
my @newarray;
my $j=0;

for(my $i= $lengthline ; $i >= 0 ; $i++) {
  @newarray[$j] = $line[$i];
  if($line[$i] =~ m/^====> START LOG.*/) {
    last;
  }
  $j++;
}

print "@newarray \n";
于 2013-10-01T06:40:25.637 回答
0

这将打印最后一个START LOG,它为最后一个块设置一个标志并打印它。

awk 'FNR==NR  { if ($0~/^====> START LOG/) f=NR;next} FNR>=f' file file

您可以使用变量,但如果您有另一个日期的文件,则需要提前知道日期。

var="2013/09/30"
awk '$0~v && /^====> START LOG/ {f=1}f' v="$var" file
====> START LOG for Background Process: HRBkg Hello on 2013/09/30 07:31:07 Log Level 3
09/30 07:31:07 I Background process is using processing model #: 3
09/30 07:31:09 I
09/30 07:31:09 I -- Started Import for External Key
于 2013-10-01T04:53:02.580 回答