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

时间:2018-06-22 16:19:32

标签: regex bash awk

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

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

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

aaa,bbb,null,ddd

aaa,bbb,,ddd

3 个答案:

答案 0 :(得分:2)

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

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

应替换为:

$1,$2,$3,$4

结果将是:

"aaa,bbb,,ddd"

答案 1 :(得分:1)

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 }};

答案 2 :(得分:1)

能否请您遵循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