当条目不确定时,如何在AWK脚本中提取值?



我有一些日志文件,例如:

[INFO] [TYPE] entryA: aaa entryB: bbb entryD: ddd

但是某些条目未记录在某些文件中。如果我想将某些值提取到 CSV 文件中,使缺少的条目值为空或特定值,我该怎么办? 例如,提取 A、B、C 和 D 时,上述行的理想输出为:

aaa,bbb,null,ddd

aaa,bbb,,ddd

考虑到entryCentryD是可选的,您可以使用正则表达式组:

/.*entryA:s(w+).*entryB:s(w+)(?:sentryC:s(w+).*|sentryD:s(w+).*)/

应替换为:

$1,$2,$3,$4

结果将是:

"aaa,bbb,,ddd"

您能否尝试关注awk,并让我知道这是否对您有帮助。考虑到您的实际Input_file与所示示例相同。

awk '
BEGIN{
array["A"];
array["B"];
array["C"];
array["D"]
}
{
for(i=1;i<=NF;i++){
if($i=="entryA:" || $i=="entryB:" || $i=="entryC:" || $i=="entryD:"){
gsub(/entry|:/,"",$i);
a[$i]=$(i+1)}
};
for(j in array){
val=j in a?(val?val "," a[j]:a[j]):(val?val "," "null":"null")
};
print val;
val=""
}'  Input_file

Perl 解决方案:

您可以通过在正则表达式中使用?量词使条目可选:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my $line = '[INFO] [TYPE] entryA: aaa entryB: bbb entryD: ddd';
my %entries;
@entries{qw{ A B C D }} = $line =~ /[INFO] [TYPE](?: entryA: )?(S*)(?: entryB: )?(S*)(?: entryC: )?(S*)(?: entryD: )?(S*)/;
say join ',', @entries{qw{ A B C D }};

但是在循环中逐个提取条目更容易:

my %entries;
$entries{$1} = $2 while $line =~ /entry([A-D]): (S+)/g;
say join ',', map $_ // "", @entries{qw{ A B C D }};

最新更新