如何将Accel-PPP默认表格输出高效转换为指定格式JSON?
把Accel-PPP表格输出转成指定JSON格式的高效命令
我懂你想要快速搞定Accel-PPP输出格式转换的需求,毕竟不是资深程序员,不想折腾复杂的脚本——下面这个用awk和sed组合的命令就能直接解决,这俩工具几乎是Linux系统默认自带的,不用额外装东西,直接在终端跑就行。
命令用法
先把你用来获取Accel-PPP会话列表的命令(比如accel-cmd show sessions)放到最前面,后面接这个处理链:
accel-cmd show sessions | awk ' BEGIN { FS = " *\\| *" # 以带空格的|作为分隔符,自动忽略字段前后的空格 first_entry = 1 } NR > 2 { # 跳过前两行:表头和分隔线 if (!first_entry) print "," # 除了第一个条目,前面加逗号分隔 printf " { \"username\":\"%s\", \"data\":{ \"ifname\":\"%s\", \"calling-sid\":\"%s\", \"rate-limit\":\"%s\" } }", $2, $1, $3, $4 first_entry = 0 } END { print "\n]" # 最后加数组闭合括号 }' | sed '1i[' # 在开头加数组开启括号
针对本地文件的用法
如果你的Accel-PPP输出已经保存成了文件(比如叫accel-sessions.txt),可以这样运行:
cat accel-sessions.txt | awk ' BEGIN { FS = " *\\| *" first_entry = 1 } NR > 2 { if (!first_entry) print "," printf " { \"username\":\"%s\", \"data\":{ \"ifname\":\"%s\", \"calling-sid\":\"%s\", \"rate-limit\":\"%s\" } }", $2, $1, $3, $4 first_entry = 0 } END { print "\n]" }' | sed '1i['
效果演示
假设你的输入是:
ifname | username | calling-sid | rate-limit ----------+----------+-------------------+------------- pppoe0 | joao | EC:22:80:A2:5E:D5 | 10240/1024 pppoe2 | pedro | C0:4A:00:88:E5:29 | 5120/1024 pppoe4 | maria | B0:4E:26:B1:75:7D | 5120/1024
运行命令后会输出你想要的JSON结构:
[ { "username":"joao", "data":{ "ifname":"pppoe0", "calling-sid":"EC:22:80:A2:5E:D5", "rate-limit":"10240/1024" } }, { "username":"pedro", "data":{ "ifname":"pppoe2", "calling-sid":"C0:4A:00:88:E5:29", "rate-limit":"5120/1024" } }, { "username":"maria", "data":{ "ifname":"pppoe4", "calling-sid":"B0:4E:26:B1:75:7D", "rate-limit":"5120/1024" } } ]
简单解释下命令逻辑
awk负责处理每一行数据:跳过无用的前两行,把每个会话的字段提取出来,按照你要的JSON格式输出每个对象sed负责给整个输出加上JSON数组的开头[,awk的END块加上结尾],这样就凑成了完整的JSON数组格式
内容的提问来源于stack exchange,提问作者andlui9
相关产品推荐
相关产品推荐

