Список томов с DF, Grep, Awk | Bash Shell - PullRequest
1 голос
/ 08 апреля 2020

Попытка напечатать все записи, которые начинаются с / Volumes /, чтобы вывести список подключенных томов на ma c. Смотрите Обновления.

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 Output

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

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

Вы можете использовать этот конвейер в 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")
1 голос
/ 09 апреля 2020

Вы можете использовать

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

Команда awk получает все строки, кроме первой (NR>1) и в которой поле 6 («Установлено») начинается с /Volumes/ (см. $6 ~ /^\/Volumes\/), а затем печатает значение поля 6.

Команда printf "%s\n" "${volumes[@]}" напечатает все элементы в массиве volumes в отдельных строках.

Если пути томов происходят чтобы содержать пробелы, вы можете проверить, существует ли ди git с последующими % с последующими пробелами и /Volume/, а затем получить объединение полей, начинающихся с поля 6, с пробелом:

df -h | awk 'NR>1 && $0 ~ /[0-9]%[ \t]+\/Volumes\//{for (i=6;i<=NF;i++) {a=a" "$i}; print a}'
0 голосов
/ 10 апреля 2020

Немного неясно, какой вывод вы хотите, но вы всегда можете использовать awk для анализа информации. Например, если вам нужна информация «Filesytem» и «Mounting on», вы можете использовать с 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.

Дайте мне знать, если вы хотите, чтобы формат или вывод отличались, и я буду рад помочь в дальнейшем. У меня нет Ma c для тестирования, но используются стандартные функции awk, а не GNU awk speci c.

...