【问题标题】:Get string from two rows从两行获取字符串
【发布时间】:2013-06-10 09:20:19
【问题描述】:

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

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

【问题讨论】:

    标签: perl sed awk grep


    【解决方案1】:

    的一种方式。它使用正则表达式来拆分字段、一个或多个连字符 (-+) 或冒号后跟可选的空格字符 (:[[: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
    

    【讨论】:

      【解决方案2】:

      这是一种方法:

      $ 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 的值。

      【讨论】:

      • 完美又简单,你能解释一下吗!?
      • @KalinBorisov 添加了简短的解释。
      • 是否可以对结果进行操作例如:RUNNING 可以转为lowerscape,需要在哪里放guess [A-Z] [a-z] 或与此列相关的字符串。
      • awk 具有tolower() 的功能,因此您只需执行{print a,$3,tolower($NF)}
      • 谢谢@sudo_O 我刚刚找到它并看到你的评论:)
      【解决方案3】:

      您可以通过 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
      

      【讨论】:

        【解决方案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
        

        【讨论】:

          【解决方案5】:

          玩具示例:

          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 打开它,它将产生您想要的确切输出。如果您需要更多解释,请发表评论。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-11-25
            • 2022-09-28
            • 1970-01-01
            • 2015-08-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多