Bash,类似json的多行字符串的模式替换



我编写了一个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中测试(

最新更新