【发布时间】:2021-07-30 05:05:20
【问题描述】:
在 shell 脚本中,我试图动态地从命令中获取输出并将其转换为 json 对象。值得庆幸的是,输出被分离成一种应该使它变得容易的格式,因为输出实际上是“key”:“value”。这应该很容易,对吧?但是我一直在摆弄和阅读这么多线程,现在我的头在旋转,我不知道现在该采取什么路线。
我似乎不知道如何在将在 vanilla macOS 主机上运行的 bash 脚本(它需要是一个 shell 脚本)中执行此操作(不使用 brew 或编译添加命令)。
我正在尝试使用类似“diskutil info /dev/disk2”的命令,输出数据如下:
Device Identifier: disk2
Device Node: /dev/disk2
Whole: Yes
Part of Whole: disk2
Device / Media Name: DataTraveler G3
Volume Name: Not applicable (no file system)
Mounted: Not applicable (no file system)
File System: None
Content (IOContent): GUID_partition_scheme
OS Can Be Installed: No
Media Type: Generic
Protocol: USB
SMART Status: Not Supported
Disk Size: 31.0 GB (30967529472 Bytes) (exactly 60483456 512-Byte-Units)
Device Block Size: 512 Bytes
Read-Only Media: No
Read-Only Volume: Not applicable (no file system)
Device Location: External
Removable Media: Removable
Media Removal: Software-Activated
Virtual: No
并获得一个(有效的)JSON 对象,如下所示:
{ "Device Identifier" : "disk2",
"Device Node" : "/dev/disk2",
"Whole" : "Yes",
"Part of Whole" : "disk2",
"Device / Media Name" : "DataTraveler G3",
"Volume Name" : "Not applicable (no file system)",
"Mounted" : "Not applicable (no file system)",
"File System" : "None",
"Content (IOContent)" : "GUID_partition_scheme",
"OS Can Be Installed" : "No",
"Media Type" : "Generic",
"Protocol" : "USB",
"SMART Status" : "Not Supported",
"Disk Size" : "31.0 GB (30967529472 Bytes) (exactly 60483456 512-Byte-Units)",
"Device Block Size" : "512 Bytes",
"Read-Only Media" : "No",
"Read-Only Volume" : "Not applicable (no file system)",
"Device Location" : "External",
"Removable Media" : "Removable",
"Media Removal" : "Software-Activated",
"Virtual" : "No"
}
现在,是的,我可以使用 awk 或其他东西手动构建它以查找“设备标识符:”并将 $0 分配给该值。但是这个 diskutil 命令的结果是动态的,并且会根据设备文件中的存储类型(/dev/disk2 vs /dev/disk3 vs /dev/disk4 等)而变化。这样就结束了。
命令 diskutil 有一个创建 -plist 的选项,macOS 有一个名为 plutil 的实用程序,可以将 plist 转换为 json... ?除了 1) plist 必须写入文件,因为 plutil 只从文件中读取,以及 2) json 对象的格式无效。什么都不感谢。这样就结束了。
我可以使用 sed 来抓取冒号之前的字符串,并将它们放在一个变量中作为键。我可以使用 sed 来抓取冒号后面的字符串并将它们放入变量中以获得值。但后来我无法理解如何将它们拉链成对。我想知道我是否可以创建一个数组并即时创建键/值对,一次一个,但我似乎也无法弄清楚。
也许我累了,或者这是不可能的(或者使用香草命令非常困难),但我会很感激任何人的指导,这可能会帮助我向前推进一点。 谢谢!
(旁注:我突然想到在这台 macOS 主机上查看“apropos json”,因此作为一个选项深入研究......呸,死路一条。)
【问题讨论】:
-
为什么它“需要是一个 bash 脚本”?一个普通的 MacOS 主机具有开箱即用的 Python。事实上,即使您要加倍考虑需要成为 bash 脚本,最好的答案还是一个 bash 脚本启动 Python,因为 Python 有 JSON 库而 bash 没有't。