我有一个 .img 文件,我想从中提取使用 fdisk 派生的 2 个值,作为 2 个变量中的字符串。
fdisk -l /home/documents/image-of-sd-card.img
Disk /home/documents/image-of-sd-card.img: 14,84 GiB, 15931539456 bytes, 31116288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc680d152
Device Boot Start End Sectors Size Id Type
/home/documents/image-of-sd-card.img1 8192 655359 647168 316M c W95 FAT32 (LBA)
/home/documents/image-of-sd-card.img2 655360 31115263 30459904 14,5G 83 Linux
我需要的值是“扇区大小”的最后一个单位(512)和第二个分区的结束大小(31115263)。如何实现这一目标?我更喜欢基于 Bash 的解决方案,这样我就可以将其集成到现有的 Shell 脚本中。
作为 Linux 的绝对初学者,我只是尝试了一些 greb 命令,但没有效果。
这里有一步一步的解释来帮助你学习 bash
输出:
解释
raw_content=$(...)
将所有输出保存在 var 中while read i ... done <<< "$raw_content"
将逐行迭代并设置i var中的值if [[ "$i" == "Sector size"* ]];
会询问字符串是否以...开头echo "$i" | cut -d ' ' -f 7
将按一个空格分开并为您提供所需的列echo "$i" | awk -F' ' '{ print $3 }'
将被几个空格分开并为您提供所需的列推荐讲座
安装后
fdisk
,您通常还可以sfdisk
使用“面向脚本”的 fdisk。您可以为其提供--json
( 或-J
) 选项,以更结构化的格式输出信息(尝试仅输入sfdisk -J /path/to/device
即可查看整个输出),然后可以由 JSON 处理器(例如jq )处理该信息,该处理器可以精确提取您想要的信息。需要。用于"$(...)"
捕获输出并将其分配给变量。如果变量较多,您可能需要合并调用。这是一个例子:
这可用于提取扇区大小
可以使用类似的模式匹配来提取第二所需值。
如果你找到一些像 类似的面向脚本的工具可能会更好
sfdisk
,而且会更安全。否则,这可以通过 grep/sed/owk 组合甚至纯 bash 来解决。
命令说明
sed
:-n
表示不打印到sed
,而p
为打印命令。sed
程序从所谓的地址开始\| <regular expression> |
,该地址充当选择器。以下块{ ... }
针对数学行执行,并包含s| <what> | <bywhat>|
我们请求替换任何内容的位置<what> = .*/ *
(意味着anychar(.) 重复任意(*
) 后跟斜杠(/) 后跟空格( ) 重复任意(*
))。我们<what>
用空字符串替换。然后我们将 (s|...|..|
)<what>
= "bytes" 与任何空格一起替换。最后我们打印 (p
) 结果。命令说明
awk
:对于与地址匹配的行,执行打印该行第三个字的/..../
命令。print
$3
--
纯
bash
解:注意:
[ ... == ... ]
与 不同[[ ... == ... ]]
。