【问题标题】:Use regex with grep to filter data from the output of a verbose command使用带有 grep 的正则表达式从详细命令的输出中过滤数据
【发布时间】:2013-08-02 14:08:18
【问题描述】:

我正在使用云环境,并且有一个命令将显示有关正在运行的 VM 的所有可用信息。这是与一个 VM 有关的一些行的示例。

RESERVATION     r-6D0F464B      170506678332    GroupD
INSTANCE        i-E9B444A9      emi-376642D8    999.99.999.999  88.888.88.888   running lock_key        0               c1.xlarge       2013-06-17T18:40:56.270Z         cluster01       eki-E7E242A3                    monitoring-disabled     999.99.999.999  88.888.88.888 ebs

我需要能够提取i-********、emi-********、IP 地址、其状态、lock_key、c1.xlarge 和监控禁用/启用。

我已经能够用一些超级简单的正则表达式来拉动整条线,但所有这些都远远超出了我的能力范围。如果有其他更简单的方法来获取这些数据,欢迎提出任何建议。

【问题讨论】:

  • 正则表达式是这里的最佳选择,除非您有非纯文本形式的数据。
  • 阅读awk,它旨在以最少的痛苦解决此类问题。祝你好运。

标签: regex linux grep centos command-line-interface


【解决方案1】:

让我们分部分进行。我能想到的最好的方法是将输出重定向到一个文件,在类似 unix 的环境中,你可以这样做:

cat your-command > filename.txt

其次,您需要逐行读取文件,如果您知道其中任何一种,或者适合您的任何语言,我会使用 python 脚本或 perl 脚本。

第三,你可以通过两种不同的方式获取值:

  1. 按位置读取列,您可以使用正则表达式获取列,例如:[^\s]+
  2. 为每个特定列编写正则表达式,因此对于 IP,您可以使用以下内容:([0-9]{1,3}\.){4} 用于监控 monitoring-([^\s]+) 等等。

【讨论】:

    【解决方案2】:

    只要字段的顺序始终相同,您只需按空格分割即可。

    伪代码(嗯,它是 ruby​​,但希望你明白):

    vms = {}
    File.open('vm-info').readlines.each do |line|
       fields = line.split('\s+')
       field_map = {}
       vm_name = fields[<index_of_vm_name>]
    
       field_map['emi'] = fields[<index_of_emi>]
       field_map['ip_address'] = fields[<index_of_ip_address]
       .
       .
       .
       vms[vm_name] = field_map
    end
    

    在此之后,vms 将被初始化以包含有关每个 vm 的信息。此时您可以简单地将它们全部打印出来,或者继续对它们进行数据操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多