使用TCL语言解析redis的配置文件

redis使用了tcl语言开发自己的测试用例

为此,可以开发一个解析redis.conf的tcl语言脚本

#!/usr/bin/tclsh

# 解析redis.conf配置文件
# 返回包括每个配置项的参数
# 注意返回命令相同,子命令相同的配置项
proc parse_redis_confg {{path redis.conf}} {
    set fd [open $path r]
    set content [read $fd]
    close $fd

    set lines [split $content "\n"]
    foreach line $lines {
        set line [string trim $line]
        if {[string index $line 0] eq "#" || [string is space $line]} {
            continue
        }
        lappend l $line
    }
    return $l
}

# 查找配置项参数
# 注意,返回的是列表
proc find_key_in_redis_config {config config_item} {
    set ret [lsearch -regexp -all -inline $config "^$config_item"]
    return $ret
}

proc print_help_screen {} {
    puts [join {
        "cfg parse path                     parse redis config"
        "cfg search path key                search key in redis config"
        "help                               show help"
    } "\n"]
}

if {$argc == 0} {
    puts "error"
} elseif {$argc == 1} {
    set opt [lindex $argv 0]
    if {$opt eq {help}} {
        print_help_screen
    } elseif {$opt eq {fish}} {
        puts "fish"
    } else {
        puts "other"
    }
} else {
    set cmd [lindex $argv 0]
    set subcmd [lindex $argv 1]
    if {$cmd eq {cfg} && $subcmd eq {parse}} {
       set ret [parse_redis_confg [file normalize [lindex $argv 2]]]
       puts $ret
    } elseif {$cmd eq {cfg} && $subcmd eq {search}} {
        set cfgs [parse_redis_confg [file normalize [lindex $argv 2]]]
        set ret [find_key_in_redis_config $cfgs [lindex $argv 3]]
        if {[llength $ret] == 1} {
            puts [lindex [lindex $ret 0] 1]
        } else {
            puts $ret
        }
    } else {
        puts "error"
    }
}

fh@Feihu-3 learn % ./parse_redisconf.tcl help
cfg parse path                     parse redis config
cfg search path key                search key in redis config
help                               show help
fh@Feihu-3 learn %

fh@Feihu-3 learn % ./parse_redisconf.tcl cfg parse ./redis.conf
{bind 127.0.0.1} {protected-mode yes} {port 6379} {tcp-backlog 511} {timeout 5} {tcp-keepalive 300} {daemonize no} {supervised no} {pidfile /var/run/redis_6379.pid} {loglevel notice} {logfile ""} {databases 16} {always-show-logo yes} {save 900 1} {save 300 10} {save 60 10000} {stop-writes-on-bgsave-error yes} {rdbcompression yes} {rdbchecksum yes} {dbfilename dump.rdb} {dir ./} {replica-serve-stale-data yes} {replica-read-only yes} {repl-diskless-sync no} {repl-diskless-sync-delay 5} {repl-disable-tcp-nodelay no} {replica-priority 100} {lazyfree-lazy-eviction no} {lazyfree-lazy-expire no} {lazyfree-lazy-server-del no} {replica-lazy-flush no} {appendonly no} {appendfilename "appendonly.aof"} {appendfsync everysec} {no-appendfsync-on-rewrite no} {auto-aof-rewrite-percentage 100} {auto-aof-rewrite-min-size 64mb} {aof-load-truncated yes} {aof-use-rdb-preamble yes} {lua-time-limit 5000} {slowlog-log-slower-than 10000} {slowlog-max-len 128} {latency-monitor-threshold 0} {notify-keyspace-events ""} {hash-max-ziplist-entries 512} {hash-max-ziplist-value 64} {list-max-ziplist-size -2} {list-compress-depth 0} {set-max-intset-entries 512} {zset-max-ziplist-entries 128} {zset-max-ziplist-value 64} {hll-sparse-max-bytes 3000} {stream-node-max-bytes 4096} {stream-node-max-entries 100} {activerehashing yes} {client-output-buffer-limit normal 0 0 0} {client-output-buffer-limit replica 256mb 64mb 60} {client-output-buffer-limit pubsub 32mb 8mb 60} {hz 10} {dynamic-hz yes} {aof-rewrite-incremental-fsync yes} {rdb-save-incremental-fsync yes}
fh@Feihu-3 learn %

fh@Feihu-3 learn % ./parse_redisconf.tcl cfg search ./redis.conf client-output-buffer-limit
{client-output-buffer-limit normal 0 0 0} {client-output-buffer-limit replica 256mb 64mb 60} {client-output-buffer-limit pubsub 32mb 8mb 60}
fh@Feihu-3 learn %

fh@Feihu-3 learn % ./parse_redisconf.tcl cfg search ./redis.conf port
6379
fh@Feihu-3 learn %
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值