从两行获取字符串

时间:2013-06-10 09:20:20

标签: perl sed awk grep

想要将输出转换为变量,从第一行想要每次都取最后一个结果。

There are 1 server(s) in cluster: SQL_GDM
MS_SQL_sql1.local.com---RUNNING
There are 2 server(s) in cluster: MONGO_GDM
MS_MONGO1_mongo1.local.com---RUNNING
MS_MONGO2_mongo2.local.com---RUNNING

预期观点:

SQL_GDM|sql1.local.com|RUNNING
MONGO_GDM|mongo1.local.com|RUNNING
MONGO_GDM|mongo2.local.com|RUNNING

现在我只使用服务器的状态:

grep -oP '(?<=---)\w+'

我想知道如何删除MS _ * _并且只保留主机,之后要grep服务器的状态。

5 个答案:

答案 0 :(得分:5)

的一种方法。它使用正则表达式来分割字段,一个或多个连字符(-+)或冒号后跟可选空格字符(:[[:space:]]*)。这样就更容易找到集群和状态。对于服务器,我使用_拆分并提取最后一条路径。

script.awk的内容:

BEGIN {
        FS = "-+|:[[:space:]]*"
}

$0 ~ /:/ {
        cluster = $NF
        next
}

{
        n = split( $1, server, /_/ )
        printf "%s|%s|%s\n", cluster, server[ n ], $NF
}

像以下一样运行:

awk -f script.awk infile

它产生了:

SQL_GDM|sql1.local.com|RUNNING
MONGO_GDM|mongo1.local.com|RUNNING
MONGO_GDM|mongo2.local.com|RUNNING

答案 1 :(得分:4)

您可以通过sed

管道输出来删除MS _ * _
echo "MS_MONGO1_mongo1.local.com---RUNNING" |  sed "s/^MS_.*_//" 

或创建一个awk脚本convert.awk

/cluster:/{ cluster = $NF; }
/^MS_/{ 
  gsub("---","|"); 
  gsub("^MS_.*_",""); 
  printf("%s|%s\n",  cluster,$0); 
}

并通过

管道输出
awk -f convert.awk

答案 2 :(得分:4)

这是一种方式:

$ awk '/^There/{a=$(NF-1)"_"$NF;next}{print a,$3,$NF}' FS='[ _-]' OFS='|' file
SQL_GDM|sql1.local.com|RUNNING
MONGO_GDM|mongo1.local.com|RUNNING
MONGO_GDM|mongo2.local.com|RUNNING

<强>解释

  • FS='[ _-]'将每个记录分隔为使用空格,下划线和连字符作为字段分隔符的字段。
  • OFS='|'使用管道符号分隔输出字段。
  • /^There/{a=$(NF-1)"_"$NF;next}如果该行以There开头,则会在变量a中存储由下划线分隔的最后两个字段,并抓住下一行。
  • {print a,$3,$NF}对于未启动的行There打印a的值,第三个字段和最后一个字段。

答案 3 :(得分:4)

perl -lne 'if(/cluster: ([\S]*)/){$a=$1}elsif(/_.*_(.*?)---(.*)/){print "$a|$1|$2"}' your_file

在下面测试

> cat temp
There are 1 server(s) in cluster: SQL_GDM
MS_SQL_sql1.local.com---RUNNING
There are 2 server(s) in cluster: MONGO_GDM
MS_MONGO1_mongo1.local.com---RUNNING
MS_MONGO2_mongo2.local.com---RUNNING
> perl -lne 'if(/cluster: ([\S]*)/){$a=$1}elsif(/_.*_(.*?)---(.*)/){print "$a|$1|$2"}' temp
SQL_GDM|sql1.local.com|RUNNING
MONGO_GDM|mongo1.local.com|RUNNING
MONGO_GDM|mongo2.local.com|RUNNING

答案 4 :(得分:2)

玩具示例:

use strict;
use warnings;

my $inputFile = shift(@ARGV);
open (my $input, $inputFile);

my $cluster = undef;

  while(<$input>)
  {
    chomp;

    if ($_ =~ /^There are \d+ server\(s\) in cluster: (\w+)$/)
    { 
        $cluster = $1; #keeps track of current cluster
    }

    else 
    {
        $_ =~ s/.*_.*_//; #removes the underscores and non-sense associated with them

        if ($_ =~ /---([A-Z]+)/)
        {
            my $temp = $1; #extracts RUNNING or NOT_RUNNING, or what have you

            $_ =~ s/---$temp//; #removes hypens/STATE from $_

            print "$cluster|$_|$temp\n";
        }
    }
  }

评论在代码中。我假设每行有一个条目。如果您将输入放入文件并将其打开为$input,它将生成您所需的确切输出。如果您需要更多解释,请发表评论。