如何过滤并排序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
相关产品推荐
相关产品推荐

