如何使用shell脚本解析rackspace大数据api响应

时间:2014-09-01 01:04:10

标签: regex bash shell awk sed

我试图在配置集群之后找出它,如果它是活动的并且使用shell脚本编写了命名节点的IP地址。以下是使用此处列出的shell命令时API输出的响应:http://docs.rackspace.com/cbd/api/v1.0/cbd-getting-started/content/viewing_Details.html

+----------+--------------------------------------+
| Property | Value |
+----------+--------------------------------------+
| Id | 4820deb2-6212-44f9-b92f-979fe723ffb8 |
| Name | foo |
| Status | ACTIVE |
| Nodes | 3 |
| Type | HADOOP_HDP2_1 |
| Flavor | hadoop1-7 |
+----------+--------------------------------------+

--------------+
| Id | Name | Role | Status | Public IP | Private IP |
+--------------------------------------+--------------+----------+--------+----------------+----------------+
| f530a9f1-79a8-4378-bf2a-b7f7e0c2bdd3 | NAMENODE-1 | NAMENODE | ACTIVE | 166.78.132.85  | 10.190.240.88  |

我相信我可以使用某种正则表达式或sed / awk来做到这一点。所以只是为了澄清我想提取当前状态和公共IP

先谢谢你

1 个答案:

答案 0 :(得分:0)

为了处理您的数据,以更易于阅读的格式转换它可能更容易,为此,请使用此过滤器:

sed -e '/^+[-+]*$/d;s/^| //;s/ |$//;s/ | /|/g'

将您的第一个表格转换为

Property|Value
Id|4820deb2-6212-44f9-b92f-979fe723ffb8
Name|foo
Status|ACTIVE
Nodes|3
Type|HADOOP_HDP2_1
Flavor|hadoop1-7

如果您愿意,可以通过调整过滤器来删除标题:

sed -e '1,3d;/^+[-+]*$/d;s/^| //;s/ |$//;s/ | /|/g'

然后,您可以将其与第二个过滤器结合使用,以您想要的任何方式进一步处理此数据:

awk -F'|' '$1 == "Status" {print($2)}"

您可以通过将这两个步骤包装到函数中并在脚本中组合这些函数来提高脚本的可读性和可维护性:

# rackspace_canonize
#  Canonize output of racksapace report tools
rackspace_canonize()
{
  sed -e '1,3d;/^+[-+]*$/d;s/^| //;s/ |$//;s/ | /|/g'
}

# rackspace_extract_status
#  Extract the status field
rackspace_extract_status()
{
  awk -F'|' '$1 == "Status" {print($2)}'
}

# rackspace_extract_public_ip
#  Extract the public IP
rackspace_extract_public_ip()
{
  awk -F'|' '{print($5)}'
}

然后,以下作文将为您提供状态:

rackspace_canonize | rackspace_extract_status

以及以下组成的公共IP:

rackspace_canonize | rackspace_extract_public_ip

请注意,您可以轻松添加中间过滤器以缩小两个*extract*函数的输入范围。