Вот решение sed, которое работает с вашим точным форматом ввода и, надеюсь, работает быстро.
sed -rz 's:[ \t]+:,:g;s:$:,:mg;:l;s:,([^,]+),(.*),\1,:,\1,\2,:;tl;s:,$::mg;s:^([^,]+),:\1\t:mg' file.csv
Флаг ' -z' загружает весь файл, поэтому следующий код применяется один раз, а не к каждой строке, как это делается по умолчанию.
#transform input format to actual CSV format
s:[ \t]+:,:g;s:$:,:mg;
#loop while the s command can still find and replace
:l;
#main code: find two identical cell values anywhere and delete the latter
#on a very big file this can suffer from backtracking nightmare
s:,([^,]+),(.*),\1,:,\1,\2,:;
tl;
#transform format back
s:,$::mg;s:^([^,]+),:\1\t:mg
В RHEL/CentOS 8 GRUB использует новый модуль blscfg
, который считывает записи для отдельных ядер Linux из /boot/loader/entries/
. Для каждой записи должен быть один файл .conf
.
Для получения дополнительной информации см.https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault
Это не относится к UEFI, но также используется классическим GRUB на основе MBR -. Фактически, каталог /boot/loader/entries/
с его файлами также будет существовать на архитектурах, которые вообще не будут использовать GRUB, например, s390x или aarch64.
Вместо номеров загрузочные записи идентифицируются именами, которые по сути являются именами отдельных файлов /boot/loader/entries/*.conf
без пути и суффикса .conf
.
Следующее может быть близким эквивалентом вашего awk
одного -вкладыша для RHEL/Centos 8:
for i in /boot/loader/entries/*.conf
do
entryname=$(basename $i.conf)
entrytitle=$(grep title $i | cut -f 2-)
echo "$entryname : $entrytitle"
done
Запись по умолчанию определяется настройкой saved_entry=
в/boot/grub2/grubenv
(в устаревших системах BIOS/MBR )или/boot/efi/EFI/redhat/grubenv
(в системах UEFI ). При установке по умолчанию оба файла будут существовать с одинаковым содержимым как в загрузочных системах BIOS/MBR, так и в UEFI -, но только один из них будет изменен GRUB, если во время загрузки будет выбрана запись по умолчанию, отличная от -.
Этот фрагмент может использоваться для идентификации текущей -выбранной загрузочной записи:
if [ -d /sys/firmware/efi ]
then
envfile=/boot/efi/EFI/redhat/grubenv
else
envfile=/boot/grub2/grubenv
fi
bootdefault=$(awk -F '=' '/^saved_entry/{print $2;}' $envfile)
echo "Default boot entry name: $bootdefault"