【问题标题】:use perl to get information using regexs使用 perl 使用正则表达式获取信息
【发布时间】:2011-01-14 10:40:54
【问题描述】:

全部,

我在 Perl 中运行的命令有以下输出。但是,我只对捕获组件及其各自的状态感兴趣。 (即“组件”和“状态”列)

我一直在考虑如何使用正则表达式来解决这个问题。我想假设我不会真正知道组件的名称,因为将来列中可能会有其他组件。我不关心中间的两个列(进程类型或 pid)。

任何建议都会有所帮助。

我的 $consoleStatus = opmnctl status 2>&1;

-------------------+--------------------+---------+---------
component          | process-type       |     pid | status
-------------------+--------------------+---------+---------
serverpro          | logloaderd         |     N/A | Down
www-daemon         | www-daemon         |   10000 | Alive
OXQA               | oqa                |   99894 | Alive
SDFW               | OC4X_SECURITY      |   27683 | Alive
FTP_Servers        | HTTP_Server        |   21252 | Alive
OID                | OID                |   27207 | Alive
DSA                | DSA                |     N/A | Down

问候,

【问题讨论】:

  • 我建议拆分每一列,然后如果每列使用管道(|)分隔,则提取第一列和最后一列。您需要使用 reg exp 的任何具体原因?
  • 一旦您将信息导入 Perl,您想用它做什么?

标签: regex perl


【解决方案1】:

假设您的输出布局没有改变,组件名称没有空格,并且可能的状态只有“Alive”和“Down”,您可以使用给定的正则表达式匹配每一行:

/^(\S+)\s+\|.+\|\s+(Alive|Down)$/

下面,我编写了一个从 STDIN 获取输入的代码,并打印出组件及其状态:

while(<STDIN>) {
    if( $_ =~ /^(\S+)\s+\|.+\|\s+(Alive|Down)$/ ) {
        print "$1 -> $2\n";
    }
}

【讨论】:

    【解决方案2】:

    您也许可以使用opmnctl options 来简化 Perl 必须处理的内容,也许:

    opmnctl status -noheaders -fsep '|' -fmt %cmp%sta
    

    我建议使用split,并在分隔字段的管道| 字符上拆分。

    这是一个简短的 sn-p,可能会给您一些想法。如果您可以使用一些 opmnctl 选项,您将能够简化此操作。

    use strict;
    use warnings;
    
    use Data::Dumper;
    
    my %component_status;
    
    LINE: for ( split( /\n/, $consoleStatus ) ) {
        # Skip the furniture in the opmnctl output
        next LINE if m/^component\W/ || m/^-/;
    
        # field 0 is the component, field 3 the status.
        my ( $component, $status ) = (split( / +\| */, $_ ))[0,3];
    
        $component_status{$component} = $status;
    }
    
    warn Dumper( \%component_status );
    

    结果:

    $VAR1 = {
          'DSA' => 'Down',
          'FTP_Servers' => 'Alive',
          'SDFW' => 'Alive',
          'serverpro' => 'Down',
          'OID' => 'Alive',
          'OXQA' => 'Alive',
          'www-daemon' => 'Alive'
        };
    

    【讨论】:

    • 似乎可能存在同名的组件,在这种情况下,我知道哈希键需要是唯一的。对此有“解决方法”吗?在插入之前重命名密钥可能是一个想法?
    • @sandster - 也许您可以使用 pid 来区分同一组件的实例?如果是这样,您可以从组件名称和 pid 组成您的哈希键,可能是 $component . ':' . $pid 或类似的。显然,您需要从 opmnctl 状态输出中提取 pid 来执行此操作。
    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多