如何从perl脚本中的日志文件中读取特定字符串

时间:2017-06-14 07:11:35

标签: perl awk readfile logfile

示例日志,

  

2016-03-29 10:57:28 UTC 642 [31871] INFO节点信息:   {" datacenter":" TEST-DC"," infraType":" saas"," service":&# 34融合&#34 ;,   " extraInfo":{" systemType":" secondary-ha1"," tenantType":" sales",   " tenantName":" sale1"}

我想阅读" tenantName":" sale1"我需要的最后一个字符串是" sale1"

尝试使用awk并在Perl脚本中切入但没有解决任何建议和/或提示会很明显

我从@Sobrique

得到了答案

使用模块JSON&一览:: MoreUtils

find( \&Count, $logDir);

my @uniqtotal = uniq @totCount;
$totalcount = @uniqtotal;

sub Count {
    if( $File::Find::name =~m!$logDir/(.*?)/$pattern! and -f $File::Find::name ) {
    my $jsonLine = `grep 'tenantName' $File::Find::name`;
    if ($jsonLine ne "") {
      $jsonLine =~ m/(\{.*\})/ ; 
      my $json_text = $1;
      my $json = decode_json ( $json_text ); 
      push @totCount, $json -> {extraInfo} -> {tenantName};
    }
   }
}

2 个答案:

答案 0 :(得分:1)

无论如何,不​​要在perl脚本中进行awk和sed。

这是JSON,因此最好解析为JSON。

#!/usr/bin/env perl

use strict;
use warnings;

use JSON;

while ( <> ) {
   my ( $json_text ) = m/(\{.*\})/; 
   my $json = decode_json ( $json_text ); 
   print $json -> {extraInfo} -> {tenantName};
}

或者简化为一个衬垫,因为这是需要做的事情:

perl -MJSON -ne 'print decode_json (/(\{.*\})/ && $1)->{extraInfo}{tenantName}'

答案 1 :(得分:0)

SELECT CASE WHEN (select max(rank) from my_table where usage='L') >= 100

grep -oP 'tenantName": "\K[^"]+' inputfile sale1

sed

Exaplanation: sed -r 's/.*"tenantName": "([^"]+).*/\1/g' inputfile sale1 grep标志只会打印字符串的匹配部分而不是整行。 -o标记将为-P启用perl正则表达式。 grep:意味着忘记左边的一切。