You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤并排序nodetool cfstats输出中part_max_mb>1000的结果

Cassandra表分区最大大小筛选与排序方案

原命令与输出

原执行命令

$ nodetool cfstats 
  | awk '($1!="Total" && $1!~"-") {print $0}'
  | awk 'BEGIN{OFS="|"; keyspacename=""; tablename=""; part_max_mb=""}
    $1=="Keyspace"{
      if($3!="keyspacename"){
        if(keyspacename!="") {
          print keyspacename, tablename, part_max_mb
        }
      }
      keyspacename=$3;
      next
    }
    $1=="Table:"{
      if($2!="tablename") {
        if(tablename!="") {
          print keyspacename, tablename, part_max_mb
        }
      }
      tablename=$2;
      next
    }
    ($1=="Compacted" && $3=="maximum"){
      part_max_mb=$5/1000000
    }
    END{print keyspacename, tablename, part_max_mb}'

注:原命令中-v keyspacename=="";这类写法有误,已修正为内部变量直接初始化(-v用于传递外部变量,内部初始化无需该标识)

原命令输出

Keyspace_name|table_name1|129.558 Keyspace_name|table_name2|1002.0908 Keyspace_name|table_name3|7.0 Keyspace_name|table_name4|4.86632 Keyspace_name|table_name5|900 Keyspace_name|table_name6|0 Keyspace_name|table_name7|0.009887 Keyspace_name|table_name8|4139.11

需求说明

仅保留part_max_mb大于1000的记录,并按part_max_mb降序排序,预期输出:

Keyspace_name|table_name8|4139.11
Keyspace_name|table_name2|1002.0908

实现方法

方案一:追加管道处理(直观易读)

在原命令后追加管道,完成分行、过滤、排序操作:

$ nodetool cfstats 
  | awk '($1!="Total" && $1!~"-") {print $0}'
  | awk 'BEGIN{OFS="|"; keyspacename=""; tablename=""; part_max_mb=""}
    $1=="Keyspace"{
      if($3!="keyspacename"){
        if(keyspacename!="") {
          print keyspacename, tablename, part_max_mb
        }
      }
      keyspacename=$3;
      next
    }
    $1=="Table:"{
      if($2!="tablename") {
        if(tablename!="") {
          print keyspacename, tablename, part_max_mb
        }
      }
      tablename=$2;
      next
    }
    ($1=="Compacted" && $3=="maximum"){
      part_max_mb=$5/1000000
    }
    END{print keyspacename, tablename, part_max_mb}'
  | tr ' ' '\n'  # 将空格分隔的多条记录转为每行一条
  | awk -F'|' '$3 > 1000'  # 筛选part_max_mb大于1000的记录
  | sort -t'|' -k3,3nr  # 按第三列数值降序排序

各步骤作用:

  • tr ' ' '\n':解决原输出用空格分隔记录的问题,转为单行单记录格式
  • awk -F'|' '$3 > 1000':以|为分隔符,判断第三列(part_max_mb)是否符合条件
  • sort -t'|' -k3,3nr:指定分隔符为|,仅对第三列做数值降序排序

方案二:整合过滤逻辑(高效精简)

将过滤逻辑直接嵌入原awk脚本,减少管道次数:

$ nodetool cfstats 
  | awk '($1!="Total" && $1!~"-") {print $0}'
  | awk 'BEGIN{OFS="|"; keyspacename=""; tablename=""; part_max_mb=""}
    $1=="Keyspace"{
      if(keyspacename!="") {
        if(part_max_mb > 1000) print keyspacename, tablename, part_max_mb
      }
      keyspacename=$3;
      next
    }
    $1=="Table:"{
      if(tablename!="") {
        if(part_max_mb > 1000) print keyspacename, tablename, part_max_mb
      }
      tablename=$2;
      next
    }
    ($1=="Compacted" && $3=="maximum"){
      part_max_mb=$5/1000000
    }
    END{
      if(part_max_mb > 1000) print keyspacename, tablename, part_max_mb
    }' | sort -t'|' -k3,3nr

该版本在输出每条记录前直接判断part_max_mb是否大于1000,无需额外转格式,最后通过sort完成降序排序。

内容的提问来源于stack exchange,提问作者suraj1287

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:09:30