Intereting Posts
Невозможно скомпилировать WiredTiger с быстрой поддержкой под rhel Неполадка с помощью правила ebtables, которое не работает: разрешение только локального сетевого трафика В чем разница между режимами I2C и PS2? Xorg: два разных файла libglx.so с двумя разными serverlayouts Команда для перечисления всех моноширинных шрифтов, известных как fontconfig Ubuntu 13.04 на ПК Acer x64, загружается только после запуска восстановления Команда BusyBox Date задает время с отметкой времени UNIX Ошибка Grub увеличивает время загрузки Каков был общий рабочий процесс для поиска / обнаружения / редактирования файлов проекта в VI (M) перед виртуальными терминалами? Обновление archlinux chroot pacman не удается Как создать плагины dnscrypt? `openssl`: Альтернативное имя субъекта Графика при загрузке, как backtrack linux или Gentoo live DVD после нажатия alt + F1 при загрузке Использование mutt для извлечения электронной почты из hotmail? Предварительно скомпилированный финал заменит Fedora 20?

Как легко выровнять записи fstab

Редактирование / etc / fstab с помощью моего текстового редактора делает все интервалы выравнивания. Я мог бы пройти через файл и вставить / удалить пробелы, чтобы выровнять все, но я ищу более автоматизированное решение. В идеале, была бы онлайн-страница javascript, в которую я мог бы включить свою fstab, и пусть она «красиво» выровняет все. Затем я мог бы скопировать / вставить окончательный результат обратно в файл.

Есть ли подобное или лучшее решение для этого?

РЕДАКТИРОВАТЬ:
Я использую Linux на своем рабочем столе, и я не хочу вступать в религию vi или emacs только для редактирования моей fstab. Emacs может быть лучшим решением для некоторых людей, но для некоторых других людей это не лучшее решение.

EDIT2:
Вот пример фрагмента моей fstab с помощью вкладок. Столбцы не выравниваются.

proc /proc proc nodev,noexec,nosuid 0 0 /dev/disk/by-label/Linux / ext4 errors=remount-ro 0 1 /dev/disk/by-label/Home /home ext4 defaults 0 0 

Я хочу, чтобы он автоматически форматировался с пробелами и выглядел более похожим на следующее.

 proc /proc proc nodev,noexec,nosuid 0 0 /dev/disk/by-label/Linux / ext4 errors=remount-ro 0 1 /dev/disk/by-label/Home /home ext4 defaults 0 0 

Мне нравится использовать команду column с параметром -t для выравнивания столбцов в таблице nice:

 column -t /etc/fstab proc /proc proc nodev,noexec,nosuid 0 0 /dev/disk/by-label/Linux / ext4 errors=remount-ro 0 1 /dev/disk/by-label/Home /home ext4 defaults 0 0 
 #!/bin/bash # usage: fstabalign [FILE] # This script will output fstab or other file as column aligned. # It will not alter blank lines or #hash comments. if [ -z "$1" ]; then FILE=$(cat /etc/fstab) else FILE=$(cat "$1") fi # Separate the file contents into aligned and unaligned parts. OUT_ALIGNED=$(echo "$FILE" | sed 's/^\s*#.*//' | nl -ba | column -t) OUT_UNALIGNED=$(echo "$FILE" | sed 's/^\s*[^#].*//' $src | nl -ba) # Remerge aligned and unaligned parts. while read; do line_aligned="$REPLY" read -u 3; line_unaligned="$REPLY" line_aligned=$( echo "$line_aligned" | sed 's/\s*[0-9]*\s*//') line_unaligned=$(echo "$line_unaligned" | sed 's/\s*[0-9]*\s*//') echo "$line_aligned$line_unaligned" done < <(echo "$OUT_ALIGNED") 3< <(echo "$OUT_UNALIGNED") 

РЕДАКТИРОВАТЬ:

Ах, до сих пор не замечал, что вы не редактируете Vim .

Альтернативой могло бы быть что-то подобное в скрипте.

Это происходит так:

  1. Извлекайте записи только, сохраняйте пустые строки, где есть комментарии.
  2. Соедините его с column и используйте -e для сохранения пустых строк, сохраните во временный файл 1.
  3. Извлечь комментарии, сохранить во временный файл 2.
  4. Слейте файлы с помощью paste с -d'\0' чтобы отменить пробелы в начале.

Сохраните файл, chmod +x script_file и запустите его как ./script_file . Необязательно укажите файл fstab ./script_file /path/to/fstab/file .

В порядке? Затем ./script_file > /etc/fstab

 #!/bin/bash src="/etc/fstab" [[ "$1" ]] && src="$1" [[ -r "$src" ]] || exit 1 tmp1="$(mktemp)" || exit 1 tmp2="$(mktemp)" || exit 1 # Filter out comments and pipe them through column with -e # Save to tmp1 sed 's/^[ \t]*#.*//' "$src" | column -et > "$tmp1" # Filter out tab lines and save to tmp2 sed 's/^[ \t]*[^#].*//' "$src" > "$tmp2" # merge paste -d'\0' "$tmp1" "$tmp2" rm "$tmp1" "$tmp2" и #!/bin/bash src="/etc/fstab" [[ "$1" ]] && src="$1" [[ -r "$src" ]] || exit 1 tmp1="$(mktemp)" || exit 1 tmp2="$(mktemp)" || exit 1 # Filter out comments and pipe them through column with -e # Save to tmp1 sed 's/^[ \t]*#.*//' "$src" | column -et > "$tmp1" # Filter out tab lines and save to tmp2 sed 's/^[ \t]*[^#].*//' "$src" > "$tmp2" # merge paste -d'\0' "$tmp1" "$tmp2" rm "$tmp1" "$tmp2" 

Vim:

Вы можете использовать скрипт Vim. Это переписывание из подобной вещи …

  • Добавляет новую команду :FmtFstab
  • Строки комментариев, начинающиеся с magic #= , также форматируются. (Таким образом, если вы закомментируете строку fstab и хотите отформатировать ее, используйте #= в начале строки. Без пробелов после #= и записи!).

Добавьте в файл сценария, который загружается, или загружайте его вручную

 :so file_name.vim 

Когда файл открывается в Vim, просто скажите :FmtFstab , и он будет отформатирован. Также форматирует заголовок соответственно.

меня также есть скрипт, который вставляет или перечисляет UUID, если это интересно. )

 " Split string by pattern " Return array/List in form : [ length, [len_match1, len_match2, ...] ] fun! s:StrSplit2Widths(line, pat) let lst=split(a:line, a:pat) call map(lst, 'strlen(v:val)') return [len(lst), lst] endfun " Generate a string based on a "widths" list " @widths: widths to use for each entry in list (format as from " s:StrSplit2Widths) " @lst : list with text to be printed according to widths fun! s:WidthFmtList(widths, lst) let i = len(a:lst) - 1 let lif="" while i >= 0 let lif = printf("%-*s", a:widths[1][i], a:lst[i]) . " " . lif let i = i - 1 endwhile return lif endfun " Format current line according to widths fun! s:FmtBufLine(widths) let lst=split(getline("."), '\s\+') if a:widths[0] != len(lst) return endif let lif = s:WidthFmtList(a:widths, lst) call setline(line("."), lif) endfun fun! <SID>:FormatFstab(...) " Comments to include let incmagic = "#=" " Header let hdr = "# <file system> <mount point> <type> <options> <dump> <pass>" " Base widths are based on header let widths = s:StrSplit2Widths(hdr, '>\zs\s*\ze<') " Get all lines (this can be expanded to only do ranges) let lines = getline(1, line("$")) " Remove all lines not matching pattern call filter(lines, 'v:val =~ "^\\s*\\([^#]\\|' . incmagic . '\\)"') " Calculate width for each column for line in lines let lw = s:StrSplit2Widths(line, '\s\+') while lw[0] < widths[0] call add(lw[1], 0) let lw[0] = lw[0] + 1 endwhile call map(widths[1], 'lw[1][v:key] > v:val ? lw[1][v:key] : v:val') endfor " Format each line matching pattern silent exec ':g/^\s*\(' . incmagic . '\|[^#]\)/ call s:FmtBufLine(widths)' " Format header let hlst = split(hdr, '>\zs\s*\ze<') silent :%s/^\s*#\s*<file system>.*/\=s:WidthFmtList(widths, hlst) endfun " ex command command! -nargs=0 -bar FmtFstab call <SID>:FormatFstab() 

Я вообще не предпочитаю никакого выравнивания (всего одно пространство). Но это интересная проблема. Интересно, почему в column нет опции для этого, кажется идеальным вариантом использования …

Выравнивание всего fstab приведет к очень длинным строкам, по крайней мере в моем случае, поскольку у меня есть несколько файловых систем со специальными параметрами, а также некоторые очень длинные пути устройства по одному идентификатору. Поэтому я написал сценарий, который выравнивает каждый раздел (разделенный пустыми строками или строками комментария) индивидуально.

Использование ./fstab.sh /etc/fstab :

 #!/bin/bash function push() { buffer="$buffer"$'\n'"$1" } function pop() { if [ "$buffer" != "" ] then echo "$buffer" | column -t buffer="" fi } buffer="" while read line do if [ "$line" == "" -o "${line:0:1}" == "#" ] then pop echo "$line" else push "$line" fi done < "$1" pop 

До:

 # /etc/fstab: static file system information. # <fs> <mountpoint> <type> <opts> <dump/pass> # --- SPECIAL --- none /dev/shm tmpfs nosuid,nodev,noexec,noatime 0 0 none /tmp tmpfs noatime,nosuid,nodev 0 0 none /var/tmp/portage tmpfs noatime,mode=0750,gid=portage,uid=portage 0 0 # --- INTERNAL --- # SSD UUID=fa15678f-7e7e-4a47-8ed2-7cea7a5d037d / xfs noatime 0 0 UUID=529cc283-53bc-4acc-a4d3-f35278d3f2f9 /home xfs noatime 0 0 # HDD UUID=d7562145-654c-48bb-b8d2-1552a69186f5 /home/TV xfs noatime 0 0 UUID=952b5dee-8d2a-40b2-85f9-5e5092bc1e75 /home/steam xfs noatime 0 0 UUID=4dcb18c3-f3a5-4b03-8877-063c5cd836e4 /home/jn xfs noatime 0 0 UUID=c735614a-f5f3-4232-911f-8a17cb033521 /var/www xfs noatime 0 0 /dev/HDD/windows7 /mnt/windows7 ntfs-3g offset=105906176,noauto,noatime 0 0 # HDD (OLD) UUID=23deb461-bab5-45b7-9dca-9c2c4cdb4f50 /mnt/HDD/OLD-home xfs noauto,noatime 0 0 UUID=dd1e1eef-b548-4c94-8ebe-99dd7a648cb0 /mnt/HDD/OLD-music xfs noauto,noatime 0 0 UUID=2ae11a11-db04-4d27-a79e-d9b07dd19650 /mnt/HDD/OLD-opt xfs noauto,noatime 0 0 UUID=2abb2a27-2183-488e-8c24-e195ab3dcb5d /mnt/HDD/OLD-portage xfs noauto,noatime 0 0 UUID=3d0030f0-92da-4e66-8e60-369dfc586df7 /mnt/HDD/OLD-portage_tmp xfs noauto,noatime 0 0 UUID=89200c49-2fc2-45ed-81c8-e244b95db7ce /mnt/HDD/OLD-root xfs noauto,noatime 0 0 UUID=caebfb75-6a1c-4ed6-ad2f-d84d80221dc3 /mnt/HDD/OLD-schrott xfs noauto,noatime 0 0 UUID=cabddcee-cf07-4526-b3a3-9270edc9d171 /mnt/HDD/OLD-src xfs noauto,noatime 0 0 UUID=a2e4df4e-8c6d-4217-8889-6f483e872190 /mnt/HDD/OLD-tmp xfs noauto,noatime 0 0 UUID=4dd484f6-4142-45b3-b504-48625de1ab5c /mnt/HDD/OLD-var xfs noauto,noatime 0 0 # ODD /dev/sr0 /mnt/cdrom auto user,noauto,ro 0 0 # --- EXTERNAL --- # USB-Boot-Stick LABEL="boot_key" /boot ext2 noauto,noatime 0 0 LABEL="boot_dos" /mnt/boot/dos vfat noauto,noatime 0 0 LABEL="boot_iso" /mnt/boot/iso ext2 noauto,noatime 0 0 LABEL="live0" /mnt/boot/live0 ext2 noauto,noatime 0 0 LABEL="live1" /mnt/boot/live1 ext2 noauto,noatime 0 0 # iriver Story HD /dev/disk/by-id/usb-iriver_Story_EB07_3230204E6F76-0:0 /mnt/iriver/knv auto user,noauto,noatime 0 0 /dev/disk/by-id/usb-iriver_Story_SD_3230204E6F76-0:1 /mnt/iriver/ext auto user,noauto,noatime 0 0 # Sandisk Sansa CLIP UUID=C65F-1E04 /mnt/mp3 auto user,noauto,noatime 0 0 # Eltern-Fernseher UUID=115BF67A31CB6C02 /mnt/wdtv ntfs-3g locale=en_US.utf8,user,noauto 0 0 UUID=D27A-7C74 /mnt/pvr vfat user,noauto,noatime 0 0 

После:

 # /etc/fstab: static file system information. # <fs> <mountpoint> <type> <opts> <dump/pass> # --- SPECIAL --- none /dev/shm tmpfs nosuid,nodev,noexec,noatime 0 0 none /tmp tmpfs noatime,nosuid,nodev 0 0 none /var/tmp/portage tmpfs noatime,mode=0750,gid=portage,uid=portage 0 0 # --- INTERNAL --- # SSD UUID=fa15678f-7e7e-4a47-8ed2-7cea7a5d037d / xfs noatime 0 0 UUID=529cc283-53bc-4acc-a4d3-f35278d3f2f9 /home xfs noatime 0 0 # HDD UUID=d7562145-654c-48bb-b8d2-1552a69186f5 /home/TV xfs noatime 0 0 UUID=952b5dee-8d2a-40b2-85f9-5e5092bc1e75 /home/steam xfs noatime 0 0 UUID=4dcb18c3-f3a5-4b03-8877-063c5cd836e4 /home/jn xfs noatime 0 0 UUID=c735614a-f5f3-4232-911f-8a17cb033521 /var/www xfs noatime 0 0 /dev/HDD/windows7 /mnt/windows7 ntfs-3g offset=105906176,noauto,noatime 0 0 # HDD (OLD) UUID=23deb461-bab5-45b7-9dca-9c2c4cdb4f50 /mnt/HDD/OLD-home xfs noauto,noatime 0 0 UUID=dd1e1eef-b548-4c94-8ebe-99dd7a648cb0 /mnt/HDD/OLD-music xfs noauto,noatime 0 0 UUID=2ae11a11-db04-4d27-a79e-d9b07dd19650 /mnt/HDD/OLD-opt xfs noauto,noatime 0 0 UUID=2abb2a27-2183-488e-8c24-e195ab3dcb5d /mnt/HDD/OLD-portage xfs noauto,noatime 0 0 UUID=3d0030f0-92da-4e66-8e60-369dfc586df7 /mnt/HDD/OLD-portage_tmp xfs noauto,noatime 0 0 UUID=89200c49-2fc2-45ed-81c8-e244b95db7ce /mnt/HDD/OLD-root xfs noauto,noatime 0 0 UUID=caebfb75-6a1c-4ed6-ad2f-d84d80221dc3 /mnt/HDD/OLD-schrott xfs noauto,noatime 0 0 UUID=cabddcee-cf07-4526-b3a3-9270edc9d171 /mnt/HDD/OLD-src xfs noauto,noatime 0 0 UUID=a2e4df4e-8c6d-4217-8889-6f483e872190 /mnt/HDD/OLD-tmp xfs noauto,noatime 0 0 UUID=4dd484f6-4142-45b3-b504-48625de1ab5c /mnt/HDD/OLD-var xfs noauto,noatime 0 0 # ODD /dev/sr0 /mnt/cdrom auto user,noauto,ro 0 0 # --- EXTERNAL --- # USB-Boot-Stick LABEL="boot_key" /boot ext2 noauto,noatime 0 0 LABEL="boot_dos" /mnt/boot/dos vfat noauto,noatime 0 0 LABEL="boot_iso" /mnt/boot/iso ext2 noauto,noatime 0 0 LABEL="live0" /mnt/boot/live0 ext2 noauto,noatime 0 0 LABEL="live1" /mnt/boot/live1 ext2 noauto,noatime 0 0 # iriver Story HD /dev/disk/by-id/usb-iriver_Story_EB07_3230204E6F76-0:0 /mnt/iriver/knv auto user,noauto,noatime 0 0 /dev/disk/by-id/usb-iriver_Story_SD_3230204E6F76-0:1 /mnt/iriver/ext auto user,noauto,noatime 0 0 # Sandisk Sansa CLIP UUID=C65F-1E04 /mnt/mp3 auto user,noauto,noatime 0 0 # Eltern-Fernseher UUID=115BF67A31CB6C02 /mnt/wdtv ntfs-3g locale=en_US.utf8,user,noauto 0 0 UUID=D27A-7C74 /mnt/pvr vfat user,noauto,noatime 0 0 

Vim должен работать или emacs. Heck даже nano должен правильно отображать fstab. Если вы хотите использовать графический интерфейс текстового редактора, вы можете попробовать gedit. Если вы действительно хотите разместить свой fstab в онлайн-редакторе, тогда вы можете использовать документы Google (а затем скопировать вставку).

Убедитесь, что вы используете вкладки, чтобы разместить свой fstab, а не отдельные пробелы. Это может привести к несоответствиям, особенно если вы используете немного их обоих.

Возможно, что это выглядит фанки, потому что окно оболочки недостаточно велико, чтобы соответствовать всему тексту в строке.