2

想把输出转换成变量,从第一行想每次取最后一个结果。

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 服务器的状态。

4

5 回答 5

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
于 2013-06-10T09:40:27.610 回答
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
于 2013-06-10T09:33:08.957 回答
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,第三个字段和最后一个字段的值。
于 2013-06-10T09:40:58.907 回答
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
于 2013-06-10T10:19:02.730 回答
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,它将产生您想要的确切输出。如果您需要更多解释,请发表评论。

于 2013-06-10T09:56:51.520 回答