Bash从命令输出中获取架构版本



我正在尝试从nodetool命令的输出中获得cassandra架构版本。

下面是一些nodeool命令的输出:

Cluster Information:
    Name: Test Cluster
    Snitch: org.apache.cassandra.locator.DynamicEndpointSnitch
    Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
    Schema versions:
        65e78f0e-e81e-30d8-a631-a65dff93bf82: [127.0.0.1]

当几个节点不可达时,输出如下:

Cluster Information:
    Name: Production Cluster
       Snitch: org.apache.cassandra.locator.DynamicEndpointSnitch
       Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
       Schema versions:
              UNREACHABLE: 1176b7ac-8993-395d-85fd-41b89ef49fbb: [10.202.205.203]

谁能建议如何得到模式版本到变量,无论是否可达?

尝试使用awk和grep命令,但由于无法访问而无法工作。

awk脚本的另一个版本将只匹配UUID类型REGEX,可以编写为使用match()设置内部RSTARTRLENGTH变量,然后可以与substr()一起使用。

就是:

awk '
  /Schema versions:/ {
    set=1
    next
  }
  set {
    match($0,/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/)
    print substr($0, RSTART, RLENGTH)
    exit
}' file

使用/输出示例

$ awk '
>   /Schema versions:/ {
>     set=1
>     next
>   }
>   set {
>     match($0,/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/)
>     print substr($0, RSTART, RLENGTH)
>     exit
> }' << 'eof'
> Cluster Information:
>     Name: Test Cluster
>     Snitch: org.apache.cassandra.locator.DynamicEndpointSnitch
>     Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
>     Schema versions:
>         65e78f0e-e81e-30d8-a631-a65dff93bf82: [127.0.0.1]
>
> eof
65e78f0e-e81e-30d8-a631-a65dff93bf82

$ awk '
>   /Schema versions:/ {
>     set=1
>     next
>   }
>   set {
>     match($0,/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/)
>     print substr($0, RSTART, RLENGTH)
>     exit
> }' << 'eof'
> Cluster Information:
>     Name: Production Cluster
>        Snitch: org.apache.cassandra.locator.DynamicEndpointSnitch
>        Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
>        Schema versions:
>               UNREACHABLE: 1176b7ac-8993-395d-85fd-41b89ef49fbb: [10.202.205.203]
> eof
1176b7ac-8993-395d-85fd-41b89ef49fbb

您可以在bash中的命令替换中使用命令来捕获变量中的结果。

如果您还有问题,请告诉我。

Awk将完成这项工作:

version=$(awk '/Schema versions:/ {
  getline
  gsub(/:/,"")
  if ($1 == "UNREACHABLE") {
    print $2
  } else {
    print $1
  }
}' < <(nodetool_cmd)) # remplace "nodetool_cmd" by the correct command
$ echo "$version" #when reachable
65e78f0e-e81e-30d8-a631-a65dff93bf82
$ echo "$version" # when unreachable
1176b7ac-8993-395d-85fd-41b89ef49fbb
# or in single line:
version=$(awk '/version/ {getline;gsub(/:/,"");if ($1 == "UNREACHABLE") {print $2} else {print $1}}' < <(nodetool_cmd))

相关内容

  • 没有找到相关文章

最新更新