Извлечь часть имени файла

A menos que se indique lo contrario, GRUB asume que el primer disco detectado por el instalador también será el primer disco detectado por el firmware del sistema. En instalaciones de CD o de red, esta heurística suele funcionar (a menos que tenga varios controladores de almacenamiento ).

Pero cuando su medio de instalación es USB, el instalador de RHEL 6 lo detecta primero antes que cualquier otro dispositivo de almacenamiento. Si está configurando una instalación kickstart, definitivamente puede decirle que escriba el gestor de arranque en /dev/sdben su lugar. Se hace usando la opción --driveorderde la palabra clave bootloader:si está iniciando el instalador desde USB, debe especificar el disco en el que se instalará el sistema operativo como el primer disco en el orden de la unidad, es decir,

bootloader --location=mbr --driveorder=sdb,sda <...>

La lógica puede parecer un poco extraña aquí. Esto se debe a que la opción realmente intenta identificar qué disco verá el BIOS del sistema como el "primer disco" al iniciar el sistema instalado, ya que la forma estándar -del BIOS de facto para seleccionar el disco desde el que iniciar es colocarlo como el primer disco en el orden visto por BIOS. Pero la opción --driveorder debe usar los nombres de los dispositivos de Linux tal como existen en el momento de la instalación...que no será necesariamente el mismo que cuando el sistema instalado se está ejecutando.

Esencialmente, debemos decirle al instalador "una vez que el sistema esté instalado y arranque por sí solo, lo que ahora es /dev/sdbserá el primer disco".

Esto será suficiente para instalar correctamente el gestor de arranque en el disco duro de destino. Pero también dejará el sistema instalado con un archivo /boot/grub/device.mapque indica que el primer disco será /dev/sdb... lo que probablemente dejará de ser cierto una vez que el sistema arranque con la unidad USB desconectada. Esto lo molestará si necesita actualizar el paquete GRUB, lo que provocará que el cargador de arranque falle después de una actualización.

Sin embargo, la solución es simple :si está creando una instalación Kickstart para USB, simplemente configure un comando de instalación posterior -para eliminar el archivo /boot/grub/device.mapdespués de que se complete la instalación. Puede ser tan simple como:

%post
rm /boot/grub/device.map

%end

Si /boot/grub/device.mapno existe, el comando grub-installlo recreará automáticamente cuando se ejecute la próxima vez... y entonces será mucho más probable que tome la decisión correcta. Si quiere estar absolutamente seguro, puede verificar la situación después de que se complete la instalación y el sistema se haya reiniciado, y escriba un archivo /boot/grub/device.mappreciso manualmente.

2
26.07.2019, 12:26
3 ответа

Я бы предложил использовать здесь cut, так как awkнемного перебор для этой задачи.

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | cut -d. -f -3
TRNPRD.STD.BSRE
3
27.01.2020, 21:55

Ваша команда awkдобавляет ., потому что вы говорите ей напечатать $i, а затем .. Таким образом, он заканчивается дополнительным .. Вместо этого вы могли бы сделать:

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | 
    awk -F'.' '{for(i=0;++i<=NF-6;) printf $i"."; print $(NF-5)}'
TRNPRD.STD.BSRE

Или просто напечатайте первые 3:

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | 
    grep -oP '^([^.]+\.){2}[^.]+'
TRNPRD.STD.BSRE

Конечно, вы также можете использовать свой оригинальный подход и просто удалить лишнее.:

$ echo TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET | 
    awk -F'.' '{for(i=0;++i<=NF- 5;) printf $i".";}' | sed 's/\.$//'
TRNPRD.STD.BSRE$ 

Однако лучшим и самым простым решением будет cut, предложенное @Panki .

1
27.01.2020, 21:55

Если вы хотите удалить из строки последние пять разделенных точкой -подстрок:

$ name=TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET
$ echo "${name%.*.*.*.*.*}"
TRNPRD.STD.BSRE

Это применяет стандартное расширение параметра , которое удаляет подстроку, соответствующую данному шаблону, из конца значения $name.


Если вы хотите сохранить первые три подстроки, разделенные точками, -в вашей строке:

$ name=TRNPRD.STD.BSRE.BREX.J.20190520.V02.PRET
$ echo "${name%.${name#*.*.*.}}"
TRNPRD.STD.BSRE

Сначала удаляются первые три бита из $name, используя${name#*.*.*.}(#удаление из левого/начала, %удаление из правого/конца ), а затем использует этот результат для удаления хвостового конца строка, оставляя три первых бита, разделенных точкой -.


Приведенные ниже предложения будут работать до тех пор, пока значение в $nameне содержит символов новой строки (, что является проблемой для любого решения, использующего стандартные инструменты обработки текста -).

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

awk -v OFS="." '{ n=split($0,a,"\."); $0=""; for (i=1; i<=3 && i<=n; ++i) $i=a[i]; print }' <<<"$name"

Это разделит значение на точки, затем создаст выходную запись из первых трех частей этого значения и напечатает ее (с разделителем выходных полей OFS, установленным в точку ).

Чтобы отбросить последние пять битов, а не оставить первые три:

awk -v OFS="." '{ n=split($0,a,"\."); $0=""; for (i=1; i<=n-5; ++i) $i=a[i]; print }' <<<"$name"
1
27.01.2020, 21:55

Теги

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