Perl 如何在多行事件中提取特定字符串值

Perl 如何在多行事件中提取特定字符串值,perl,awk,Perl,Awk,这是我的多线活动。我需要做的就是创建一个带有时间戳、用户、ecid和RemoteIP值的csv文件。这些字段在“我的多行事件”的第1行、第11行、第14行和第16行中可用。我尝试使用AWK,能够查找以User、ecid等开头的行,并且能够使用 awk -F'[=:]' '/User|ecid|RemoteIP/{print NR ", " $2 }' filename.txt 但是需要知道如何获得第1行的时间戳。此外,还需要知道如何使这4个值显示在由管道分隔的单行中。我在这里寻找AWK或Pe

这是我的多线活动。我需要做的就是创建一个带有时间戳、用户、ecid和RemoteIP值的csv文件。这些字段在“我的多行事件”的第1行、第11行、第14行和第16行中可用。我尝试使用AWK,能够查找以User、ecid等开头的行,并且能够使用

awk -F'[=:]' '/User|ecid|RemoteIP/{print NR ", " $2  }' filename.txt
但是需要知道如何获得第1行的时间戳。此外,还需要知道如何使这4个值显示在由管道分隔的单行中。我在这里寻找AWK或Perl中的一些输入

[2019-03-01T10:08:30.00] [OBIPS] [TRACE:1] [] [saw.httpserver.request.showrequest] [ecid: 90b8:1e:16:-800-000,0:9] [tid: 563620160] Request received.
Type: POST            Headers:
Connection=Keep-Alive
Content-Length=58
Cookie=ORA_BIPS_LBINFO=16938b9e78c
User-Agent=Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36
X-BlueCoat-Via=56038f342870633d
X-Forwarded-For=10.132.198.91
            Request params:
bieehome
icharset=utf-8
User=bi_admin
Password=******
SessionID: 9n5be88r2b041s5s6toojpagruk7ums
ecid: 90b8:1e:16:-800-000,0:9
ThreadID: 5636201600
RemoteIP: 10.192.121.136
]]
乌普图
请您尝试一下下面的内容,我们也将很快添加非一行格式的代码解释

awk  '
BEGIN{
  OFS=" | "
  print "Timestamp | User | ecid | RemoteIP"
}
/^\]\]/{
  if(val){
      print val
  }
  val=""
}
/^\[[0-9]+\-[0-9]+\-[0-9]+/{
  gsub(/\]|\[|\..*/,"",$1)
  val=$1
  next
}
/User=/{
  sub(/.*User=/,"")
  val=val OFS $0
  next
}
/ecid/{
  sub(/.*: /,"")
  val=val OFS $0
  next
}
/RemoteIP/{
  sub(/.*: /,"")
  val=val OFS $0
}
END{
  if(val){
    print val
  }
}
'  Input_file
输出如下

Timestamp | User | ecid | RemoteIP
2019-03-01T10:08:30 | bi_admin | 90b8:1e:16:-800-000,0:9 | 10.192.121.136
上述代码的解释:

使用空格或:后跟空格或=或[或]作为字段分隔符FS。OFS是输出字段分隔符

awk 'BEGIN{FS=" |: |=|\\[|\\]"; OFS=" | "} 
     $5=="OBIPS"    {time=$2}
     $1=="User"     {user=$2}
     $1=="ecid"     {ecid=$2}
     $1=="RemoteIP" {ip=$2; print time,user,ecid,ip}' file
输出:

2019-03-01T10:08:30.00 | bi_admin | 90b8:1e:16:-800-000,0:9 | 10.192.121.136
请参阅:

请将您对该示例输入的所需输出添加到您的问题中。嗨,Cyrus,我已将其包含在我的question@SaravananK,评论不是为了展示预期的样品,请在您的帖子中添加,然后让我们知道?太棒了。这正是我想要的-Thanks@SaravananK,很高兴它帮助了你,也将添加解释,以便我们都可以从中学习,你可以通过它学习,干杯。@SaravananK,现在添加了解释,请查看它,并在有任何疑问时通知我。解释非常有用。我不明白的是gsub部分。全局替换]和[from 1st field.这有什么意义?@SaravananK,这是指时间戳行,其中您的输入有[or],因此通过此命令将其删除。
awk 'BEGIN{FS=" |: |=|\\[|\\]"; OFS=" | "} 
     $5=="OBIPS"    {time=$2}
     $1=="User"     {user=$2}
     $1=="ecid"     {ecid=$2}
     $1=="RemoteIP" {ip=$2; print time,user,ecid,ip}' file
2019-03-01T10:08:30.00 | bi_admin | 90b8:1e:16:-800-000,0:9 | 10.192.121.136