【发布时间】:2024-01-18 04:29:02
【问题描述】:
尝试打印以 /Volumes/ 开头的所有条目,以列出 mac 上已安装的卷。请参阅更新。
IFS=$'\n' read -r -d '' -a volumes < <(
df | egrep -o '/Volumes/.*'
)
echo "${volumes}"
更新 1:这有效,但在每个新行之前打印一个空格。
#!/usr/bin/env bash
IFS=$'\n' read -r -d '' -a volumes < <(
df | egrep -oi '(\s+/Volumes/\S+)'
)
printf "%s\n" "${volumes[@]}"
更新 2:有效,但不打印包含空格的卷名
IFS=$'\n' read -d '' -ra volumes < <(
df | awk 'index($NF, "/Volumes/")==1 { print $NF }'
)
printf '%s\n' ${volumes[@]}
更新 3:在新行上打印卷名的第二部分,其中包含空格
IFS=$'\n' read -d '' -ra volumes < <(
df | awk -F ' {2,}' 'index($NF, "/Volumes/")==1 { print $NF }'
)
printf '%s\n' ${volumes[@]}
解决方案:
测试平台: macOS Catalina
IFS=$'\n' read -d '' -ra volumes < <(
df | sed -En 's~.* (/Volumes/.+)$~\1~p'
)
printf '%s\n' "${volumes[@]}"
DF 输出
Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on
/dev/disk1s5 976490576 21517232 529729936 4% 484332 4881968548 0% /
devfs 781 781 0 100% 1352 0 100% /dev
/dev/disk1s1 976490576 413251888 529729936 44% 576448 4881876432 0% /System/Volumes/Data
/dev/disk1s4 976490576 10487872 529729936 2% 6 4882452874 0% /private/var/vm
map auto_home 0 0 0 100% 0 0 100% /System/Volumes/Data/home
/dev/disk7s1 40880 5760 35120 15% 186 4294967093 0% /private/tmp/tnt12079/mount
/dev/disk8s1 21448 1560 19888 8% 7 4294967272 0% /Volumes/usb drive
/dev/disk6s1 9766926680 8646662552 1119135456 89% 18530 48834614870 0% /Volumes/root
/dev/disk2s1 60425344 26823168 33602176 45% 419112 525034 44% /Volumes/KINGS TON
【问题讨论】:
-
(1) 您的
read创建了一个array 变量,每个元素都有一个输入行。${volumes}仅扩展到第一个元素(下标 0);使用${volumes[@]}或可能${volumes[*]}(2) 数组中的每一行/元素应该 是一个匹配的字符串,我不知道为什么它不是。手动查看df | egrep -o ...,看看是否正确。 -
尝试
df | egrep -o '(^/Volumes/\S+)'或df | egrep -o '(\s+/Volumes/\S+)'取决于您想要的列(使用 -i 表示不区分大小写) -
请看更新,空白问题
-
它没有打印任何空间。试试我的解决方案。
-
这适用于文件名中的空格
df | egrep -oi '(\s+/Volumes/.*)' | egrep -o '(/.*)'
标签: regex bash awk grep linux-disk-free