我编写了一个bash脚本,它基本上将df-一个命令转换为多个新行分隔的Json格式的对象。
PATTERN='!/loop/ && /^// {printf
""disk.device":"%s","
""disk.mount":"%s","
""disk.total":%d,"
""disk.used":%d,"
""disk.free":%d,"
""disk.percentage":%.2fn", $1, $6, $2, $2-$4, $4, ($2-$4)/($2+1)*100}'
MODE=""
NAME="disk.device"
PAYLOAD="$(df -a | awk "$PATTERN")"
jsonify.sh $MODE "$PAYLOAD"
脚本分为两个步骤:
- 创建一个";proto-json";有效载荷
- 将其转换为实际的json
$PAYLOAD
变量通过awk构造,然后传递给jsonify函数。
以下是输出示例:
"disk.device":"/dev/nvme0n1p2","disk.mount":"/","disk.total":47745772,"disk.used":29455764,"disk.free":18290008,"disk.percentage":61,69
"disk.device":"/dev/nvme0n1p1","disk.mount":"/boot/efi","disk.total":583544,"disk.used":5356,"disk.free":578188,"disk.percentage":0,92
"disk.device":"/dev/nvme0n1p4","disk.mount":"/home","disk.total":427115864,"disk.used":46328340,"disk.free":380787524,"disk.percentage":10,85
"disk.device":"/dev/fuse","disk.mount":"/run/user/1000/doc","disk.total":0,"disk.used":0,"disk.free":0,"disk.percentage":0,00
不幸的是,出现了一个新的要求,现在"disk.device"
的值需要从磁盘的实际名称替换为disk_n
,其中n是整数。
在上面的例子中,结果看起来像:
"disk.device":"disk_0","disk.mount":"/","disk.total":47745772,"disk.used":29455764,"disk.free":18290008,"disk.percentage":61,69
"disk.device":"disk_1","disk.mount":"/boot/efi","disk.total":583544,"disk.used":5356,"disk.free":578188,"disk.percentage":0,92
"disk.device":"disk_2","disk.mount":"/home","disk.total":427115864,"disk.used":46328340,"disk.free":380787524,"disk.percentage":10,85
"disk.device":"disk_3","disk.mount":"/run/user/1000/doc","disk.total":0,"disk.used":0,"disk.free":0,"disk.percentage":0,00
是否可以使用单个命令(也许是awk?(来制定解决方案,或者我是否需要一个贯穿有效负载所有行的显式循环?如果是后者你会怎么做?
echo "$output" | awk -F, -v OFS=, '{
disk_n = "disk_" (NR - 1)
sub(/"[^"]+"$/, """ disk_n """, $1)
print
}'
在GNUAWK
中,可以使用postincrease来获得从零开始的运行数,考虑下面的例子,让file.txt
的内容是
100
1000
10
10000
1
100000
并且您希望输出值>=的序数后跟数字500,那么你可以做
awk '$1>=500{printf "%d %sn", i++, $1}' file.txt
它给出输出
0 1000
1 10000
2 100000
(在gawk 4.2.1中测试(