В настоящее время я пишу сценарий, который упрощает установку устройств LUKS. В сценарии у меня есть имя точки монтирования по умолчанию (data_1), однако, если подобная точка монтирования уже существует, я хочу увеличить числовой суффикс, протестировать снова и так далее, пока не найду строку, которая еще не точка монтирования.

Например, я могу перечислить точки монтирования так: lsblk -o MOUNTPOINTS.

Предположим, что вывод:

/
/boot
/mnt/data_1
/mnt/data_2
/mnt/data_3
/var/lib/docker

Мое имя точки монтирования по умолчанию — data_1. Теперь я хочу получить действительное новое имя точки монтирования. В данном случае это будет data_4, потому что data_1 , data_2 и data_3 уже существуют. Какой самый простой способ получить имя, которое увеличивается таким образом? Я предполагаю, что я могу сделать некоторую магию awk, может быть?

1
Kyu96 14 Окт 2021 в 01:46

2 ответа

Лучший ответ

Действительно, awk может прийти на помощь. В этом фрагменте префикс точки монтирования — data, и он отделен от своего порядкового номера символом подчеркивания.

awk -F '_' -v mp='data' '
    BEGIN { re = "^(.*/)?" mp FS "[0-9]+$" }    # Build a RE to match relevant mountpoints
    $0 ~ re && $NF > x { x = $NF }              # Save the highest sequence number
    END { print mp FS x+1 }                     # Print the next value
'

Вывод из вашего примера

data_4

Или, если бы вы установили mp='/mnt/data', вы бы получили /mnt/data_4. Либо будет работать.

2
roaima 14 Окт 2021 в 17:13
Отлично, спасибо!
 – 
Kyu96
14 Окт 2021 в 02:10
$ awk -v base='/mnt/data_' 'sub(base,"") && ($1>max){max=$1} END{print base max+1}' file
/mnt/data_4
1
Ed Morton 14 Окт 2021 в 17:15