Как получить список всех монтирований, которые начинаются с заданного префикса/корня

Как поясняется вman sort:

   -n, --numeric-sort
          compare according to string numerical value

Так ты хочешь:

$ sort -nk1,1 file
1,2,3
2,1,1
10,2,1

Также обратите внимание, что по умолчанию поля разделены пробелами, поэтому эти строки в этом файле содержат только одно поле. Например, первое поле первой строки — 1,2,3, а не 1. Вам нужно будет добавить -t,для ,-separatedполей:

sort -t, -nk1,1 file

С -nsortучитывает только последовательность символов, которая образует допустимое число в начале ключа сортировки (, игнорируя начальные пробелы ). Для этой первой строки без -t,, в зависимости от реализации sortи локали, 1,2,3будет рассматриваться либо как 1, либо как 1.2(, когда десятичный разделитель пользователя —,)или 123(. когда пользовательским разделителем тысяч является ,и sortигнорирует любое его появление ).

0
17.08.2019, 06:48
2 ответа
foo () {
    awk '{ print $2 }' /proc/mounts |
    while read -r mountpoint; do
        for pattern do
            if [[ $mountpoint == $pattern ]]; then
                printf '%s:\t%s\n' "$pattern" "$mountpoint"
                break
            fi
        done
    done
}

Эта bashфункция анализирует второй столбец, точку монтирования, из /proc/mounts, а затем продолжает сравнивать каждый из заданных аргументов как шаблоны оболочки с каждой из точек монтирования. Для каждого совпадения печатается соответствие шаблону и точка монтирования, и рассматривается следующая точка монтирования. Выходной формат легко изменить, изменив команду printf.

Пример запуска в системе Ubuntu. У меня есть доступ к (обратите внимание, что шаблоны представляют собой шаблоны подстановки имен файлов и что шаблоны, содержащие символы подстановки, должны быть защищены от оболочки с помощью кавычек ).

$ foo /sys '/sys/*' '*info*'
/sys:   /sys
/sys/*: /sys/firmware/efi/efivars
/sys/*: /sys/fs/fuse/connections
/sys/*: /sys/fs/pstore
/sys/*: /sys/kernel/debug
/sys/*: /sys/kernel/debug/tracing
/sys/*: /sys/kernel/security
*info*: /proc/cpuinfo
*info*: /proc/meminfo
/sys/*: /sys/fs/cgroup
/sys/*: /sys/fs/cgroup/systemd
/sys/*: /sys/fs/cgroup/perf_event
/sys/*: /sys/fs/cgroup/cpu,cpuacct
/sys/*: /sys/fs/cgroup/hugetlb
/sys/*: /sys/fs/cgroup/freezer
/sys/*: /sys/fs/cgroup/blkio
/sys/*: /sys/fs/cgroup/cpuset
/sys/*: /sys/fs/cgroup/pids
/sys/*: /sys/fs/cgroup/net_cls,net_prio
/sys/*: /sys/fs/cgroup/memory
/sys/*: /sys/fs/cgroup/devices

Я решил использовать цикл оболочки в функции для чтения вывода из программы awkвместо того, чтобы выполнять сопоставление в самой программе awk(, что обычно было бы тем, что я бы сделал ). Я сделал это, потому что хотел иметь простой способ перебора шаблонов и использования оператора ==в bash.

Кстати, если вы хотите вместо этого использовать расширенные регулярные выражения, просто измените ==в функции на =~,но помните, что вам нужно будет привязать выражение к ^и $, чтобы оно соответствовало определенному пути (, как в ^/sys$), в противном случае выражение будет совпадать где угодно в пути.

0
28.01.2020, 03:21

Вот вам альтернатива. Мои awkнавыки только зарождаются, и я был бы признателен за любые отзывы о том, как улучшить использование, показанное здесь.

show_mount_prefix() {

# $1 is a directory prefix.  Display all current mounts that have that prefix.

  printf '"%s" ' $(mount | awk -v prefix=" on ${1}[/ ]" '$0~prefix {print $3}')
  printf '\n'
}

Без аргумента show_mount_prefix()отображает все точки монтирования [разрывы строк добавлены для удобочитаемости]:

$ show_mount_prefix 
"/sys" "/proc" "/dev" "/dev/pts" "/run" "/" "/sys/kernel/security" 
"/dev/shm" "/run/lock" "/sys/fs/cgroup" "/sys/fs/cgroup/unified" 
"/sys/fs/cgroup/systemd" "/sys/fs/pstore" "/sys/fs/cgroup/perf_event" 
"/sys/fs/cgroup/memory" "/sys/fs/cgroup/cpu,cpuacct" "/sys/fs/cgroup/pids" 
"/sys/fs/cgroup/devices" "/sys/fs/cgroup/freezer" "/sys/fs/cgroup/blkio" 
"/sys/fs/cgroup/rdma" "/sys/fs/cgroup/cpuset" "/sys/fs/cgroup/net_cls,net_prio" 
"/sys/fs/cgroup/hugetlb" "/dev/mqueue" "/sys/kernel/debug" 
"/proc/sys/fs/binfmt_misc" "/dev/hugepages" "/sys/kernel/debug/tracing" 
"/sys/fs/fuse/connections" "/sys/kernel/config" "/snap/core/7270" 
"/snap/core/7396" "/data" "/var/lib/lxcfs" "/run/user/370880" "/run/user/0"

С аргументом:

$ show_mount_prefix /dev
"/dev" "/dev/pts" "/dev/shm" "/dev/mqueue" "/dev/hugepages" 

К сожалению, этот алгоритм не обрабатывает аргумент /, который предположительно будет перечислять все монтирования, как и в случае без аргумента -. Когда-то это было так, но добавление атома [/ ]в паттерн awkнарушило это. Этот атом необходим, учитывая, что OP не хочет, чтобы /dсоответствовало /devи /dataи тому подобное.

0
28.01.2020, 03:21

Теги

Похожие вопросы