1

尝试打印以 /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[@]}"

测向输出

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
4

3 回答 3

1

您可以在以下位置使用此管道OSX

IFS=$'\n' read -d '' -ra volumes < <(
df | sed -En 's~.* (/Volumes/.+)$~\1~p'
)

检查数组内容:

printf '%s\n' "${volumes[@]}"

或者

declare -p volumes

declare -a volumes=([0]="/Volumes/Recovery" [1]="/Volumes/Preboot")
于 2020-04-09T21:45:38.473 回答
1

您可以使用

IFS=$'\n' read -r -d '' -a volumes < <(
  df -h | awk 'NR>1 && $6 ~ /^\/Volumes\//{print $6}'
)
printf "%s\n" "${volumes[@]}"

awk命令获取除第一行 ( NR>1) 和字段 6(“Mounted on”)以/Volumes/(参见$6 ~ /^\/Volumes\/)开头的所有行,然后打印字段 6 值。

printf "%s\n" "${volumes[@]}"命令将在单独的行上打印volumes数组中的所有项目。

如果卷路径恰好包含空格,您可以检查是否有一个数字后跟%空格,然后使用空格/Volume/连接以字段 6 开头的字段:

df -h | awk 'NR>1 && $0 ~ /[0-9]%[ \t]+\/Volumes\//{for (i=6;i<=NF;i++) {a=a" "$i}; print a}'
于 2020-04-08T22:29:03.023 回答
0

有点不清楚你想要什么输出,但你总是可以awk用来解析信息。例如,如果您想要“Filesytem”和“Mounted on”信息,您可以使用 with df

df | awk '{
    for (i=1; i<=NF; i++)
        if ($i ~ /^\/Volumes/) {
            print $1, substr($0, match($0,/\/Volumes/))
            break
        }
    }'

或者使用您在文件中提供的输入dfout,您可以将文件读取为:

awk '{
    for (i=1; i<=NF; i++)
        if ($i ~ /^\/Volumes/) {
            print $1, substr($0, print $1, substr($0, match($0,/\/Volumes/)))
            break
        }
}' dfout

示例输出

将文件dfout与您的数据一起使用,您将收到:

/dev/disk8s1 /Volumes/usb drive
/dev/disk6s1 /Volumes/root
/dev/disk2s1 /Volumes/KINGS TON

如果您需要或多或少的每条记录,您可以在print语句中输出您喜欢的任何其他字段。

如果您想要不同的格式或输出,请告诉我,我很乐意为您提供进一步帮助。我没有要测试的 Mac,但使用的功能是标准的awk,而不是特定于 GNUawk的。

于 2020-04-10T07:44:38.707 回答