我有以下数据:
====>后台进程开始日志:HRBkg Hello on 2013/09/27 23:20:20 Log Level 3
09/27 23:20:20 I后台进程正在使用 处理模型#:3
09/27 23:20:23我在09/27 23:20:23我 - 开始导入外部键
====>启动后台进程日志:HRBkg Hello on 2013/09/30 07:31:07 Log Level 3
09/30 07:31:07 I后台进程正在使用 处理模型#:3
09/30 07:31:09我在09/30 07:31:09我 - 开始导入外部密钥
我需要在 ====> START LOG
..... 的最后一次匹配后提取剩余的文件内容
我曾多次尝试使用sed
/ awk
但是,我似乎无法让awk
在我的正则表达式中使用变量。我试图包含的变量是日期(2013/09/30),因为这是该行唯一的原因
我在HP-UX
计算机上,无法使用grep -A
。
有什么建议吗?
答案 0 :(得分:3)
没有必要测试特定时间只是为了找到文件中的最后一个条目:
awk '
BEGIN { ARGV[ARGC] = ARGV[ARGC-1]; ARGC++ }
NR == FNR { if (/START LOG/) lastMatch=NR; next }
FNR == lastMatch { found=1 }
found
' file
答案 1 :(得分:1)
这可能适合你(GNU sed):
a=2013/09/30
sed '\|START LOG.*'"$a"'|{h;d};H;$!d;x' file
答案 2 :(得分:1)
这将返回您想要的输出。
sed -n '/START LOG/h;/START LOG/!H;$!b;x;p' file
如果您有tac
可用,则可以轻松实现..
tac <file> | sed '/START LOG/q' | tac
答案 3 :(得分: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)(.*)'
答案 4 :(得分:0)
对于记录,您可以轻松地将变量与Awk中的正则表达式进行匹配,反之亦然。
awk -v date='2013/09/30' '$0 ~ date {p=1} p' file
如果输入行与日期匹配,则会将p
设置为1;如果p
为非零,则会打印。
(回想一下,Awk中的一般形式是条件 {
动作 }
,其中动作块是可选的;如果省略,则默认操作是打印当前输入行。)
答案 5 :(得分: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
答案 6 :(得分: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";
答案 7 :(得分: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