Как сделать строки столбца -t` игнорировать с конкретными характеристиками?

Я просто подумал, насколько аккуратно было бы подключить мой /etc/fstab через column -te чтобы получить красиво отформатированную таблицу.
Но column конечно, не имеет возможности различать строки комментариев и определения точек монтирования, поэтому комментарии также разбиваются на каждый пробел и отформатируются в столбцах таблицы:

 # /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/sda2 during installation UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1 # /home was on /dev/sda2 during installation UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2 

Есть ли способ сделать строки только для строк, которые не начинаются с символа # ?


Edit: Кажется, мне нужно уточнить, что приведенный выше пример действительно является действительным fstab . Btrfs имеет подвыборы, которые могут монтироваться отдельно с subvol и subvolid .
Это также означает, что устройства в первом столбце fstab не обязательно уникальны.

  • Форматировать текст с пробелами между строками
  • Как использовать команду fmt с нелатинскими символами?
  • Сплит и формат файла в Linux в одной строке
  • Grep - конкретный столбец
  • Текстовый файл в полях (столбцах) каждого n-го вхождения строки
  • Форматировать текст в Linux
  • Дублирование строк, кроме строки заголовка
  • 5 Solutions collect form web for “Как сделать строки столбца -t` игнорировать с конкретными характеристиками?”

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

     column -t /etc/fstab | sed '/^#/ s/ \{1,\}/ /g' 

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

     sort -nk1,1 \ <(nl -nln /etc/fstab | grep -vE '^[[:digit:]]+[[:space:]]+#'| column -t | sed 's/ \{1,\}/\t/') \ <(nl -nln /etc/fstab | grep -E '^[[:digit:]]+[[:space:]]+#') \ | cut -f2- 

    С sed и nl :

     nl -ba -nrz -s: /etc/fstab | \ sed '/^[[:digit:]]*:[[:blank:]]*\(#\|$\)/d;//!{s/\\/&&/g}' | \ column -t | sed 's|^0*\([[:digit:]]*\):\(.\)|\1c\\\ \2|' | sed -f - /etc/fstab 

    или с sed и grep :

     grep -nvE '^[[:blank:]]*(#|$)' /etc/fstab | \ sed -E 's/\\/&&/g;s/^([[:digit:]])*:(.*)/\1c\\\ \2/' | column -t | sed -f - /etc/fstab 

    или короче, с sed и awk :

     awk '!/^[[:blank:]]*(#|$)/{print NR"c\\";gsub(/\\/,"&&");print}' \ /etc/fstab | column -t | sed -f - /etc/fstab 

    С тестовым файлом:

     # /etc/fstab: static file system information # <file system> <dir> <type> <options> <dump> <pass> LABEL=ROOT / ext4 noatime,discard 0 1 UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1 # /home was on /dev/sda2 during installation UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2 LABEL=SWAP none swap sw,discard 0 0 UUID=7fa3-cb08 /media ext4 defaults 0 0 

    выход:

     # /etc/fstab: static file system information # <file system> <dir> <type> <options> <dump> <pass> LABEL=ROOT / ext4 noatime,discard 0 1 UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1 # /home was on /dev/sda2 during installation UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2 LABEL=SWAP none swap sw,discard 0 0 UUID=7fa3-cb08 /media ext4 defaults 0 0 

    Как они работают:
    Последний sed -f - /etc/fstab изменяет только определения точек монтирования в /etc/fstab (оставляя остальные строки, включая пустые, без изменений), используя сценарий ( - read from stdin ), созданный предыдущим команды:

     4c\ LABEL=ROOT / ext4 noatime,discard 0 1 5c\ UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1 7c\ UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2 8c\ LABEL=SWAP none swap sw,discard 0 0 9c\ UUID=7fa3-cb08 /media ext4 defaults 0 0 

    Первый использует nl -ba -nrz -s: для номера всех строк тогда

     sed '/^[[:digit:]]*:[[:blank:]]*\(#\|$\)/d;//!{s/\\/&&/g}' 

    удаляет строки, которые изначально были прокомментированы или пустыми, и избегает любых обратных косых черт в оставшихся строках (не обязательно в этом конкретном случае, я знаю), то вывод затем передается в column -t поэтому только определения точек монтирования делятся на столбцы:

     000004:LABEL=ROOT / ext4 noatime,discard 0 1 000005:UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1 000007:UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2 000008:LABEL=SWAP none swap sw,discard 0 0 000009:UUID=7fa3-cb08 /media ext4 defaults 0 0 

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

     sed 's|^0*\([[:digit:]]*\):\(.\)|\1c\\\ \2|' 

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

     grep -nvE '^[[:blank:]]*(#|$)' | sed -E 's/\\/&&/g;s/^([[:digit:]])*:(.*)/\1c\\\ \2/' 

    или

     awk '!/^[[:blank:]]*(#|$)/{print NR"c\\";gsub(/\\/,"&&");print}' 

    будут совпадать только с определениями точек монтирования, сбрасывать обратную косую черту (если есть), напечатать номер строки, за которой следует c\ и (в отдельной строке) фактическое содержимое строки:

     4c\ LABEL=ROOT / ext4 noatime,discard 0 1 5c\ UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1 7c\ UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2 8c\ LABEL=SWAP none swap sw,discard 0 0 9c\ UUID=7fa3-cb08 /media ext4 defaults 0 0 

    который затем отправляется в column -t для создания того же файла сценария.


    Другой способ с ed который делает то же самое, но читает файл только один раз:

     ed -s <<IN <(nl -ba -nrz -s: /etc/fstab) | sort -t: -k1,1 | cut -d: -f2- g/^[[:digit:]]*:[[:blank:]]*\(#\|$\)/p g//d ,w !column -t q IN 

    Пронумерованные строки используются в качестве входных данных для ed , первая подкоманда p устанавливает все строки ( g ), которые изначально были прокомментированы или пустыми, а вторая выбрала их, а затем остальные строки передаются как вход ( w ) в shell ( ! ) командный column -t . Весь вывод sort и cut удаляет ведущие числа.

    Предложение «Как просто удалить комментарии перед подачей в column ?» Не является полностью беззначительным.

     #!/bin/sh nl -ba /etc/fstab | sed "s/^ *//; s/\t/ /" > file0 grep "^[0-9][0-9]* #" file0 > file1 grep -v "^[0-9][0-9]* #" file0 > file2 (cat file1; column -t file2) | sort -n | sed "s/^[0-9][0-9]* *//" 

    nl –ba номера каждой строки; формат, фактически, %6d\t ; т.е. число с ведущими пробелами, за которым следует вкладка. sed "s/^ *//; s/\t/ /" разбивает ведущие пробелы и заменяет вкладку пробелом, что делает его более похожим на то, как выглядит column . Команды grep разбивают file0 на file1 , строки с комментариями и file2 , строки без комментариев. ( XX * означает X за которым следует ноль или более X s, другими словами: один или несколько X s. Это версия «бедного человека» X + , то есть способ сказать один или несколько X s в переносном / универсальный способ.) Каждый файл сохраняет номера строк из исходного файла /etc/fstab .

    (cat file1; column -t file2) запускает строки без комментариев через column –t , объединяя результат с прокомментированными строками (чей горизонтальный интервал не изменяется). Затем sort –n возвращает строки в исходный порядок, а sed "s/^[0-9][0-9]* *//" удаляет номера строк.

    Вывод:

     # /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> # / was on /dev/sda2 during installation UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 / btrfs defaults,subvol=@rootfs,metadata_ratio=6 0 1 # /home was on /dev/sda2 during installation UUID=8fa99d69-8dac-4aca-bb61-90f753ba5169 /home btrfs defaults,subvol=@home 0 2 

    Обратите внимание, что это поддерживает пустые строки и строки комментариев со встроенным пробелом (т. Е. Встроенными вкладками или строками из двух или более пробелов), но не с отступом (т. Е. Ведущими вкладками или пробелами).

    Если вы хотите немного упростить этот скрипт (т. Е. Сделать его более производственной версией), вы можете

    • Заменяйте временные файлы файлами /tmp произвольно ( mktemp ) сгенерированными именами.
    • Удалите временные файлы по завершении.
    • Измените использование [0-9]+ где это необходимо (это может быть неприменимо к вам, если у вас слишком старая система, например, Solaris, AIX или что-либо без инструментов GNU).
    • Распределите file1 и file2 и сжимайте последнюю строку до чего-то вроде

       (grep "^[0-9][0-9]* #" file0; grep -v "^[0-9][0-9]* #" file0 | column -t) | … 

      Но я считаю, что лучше взять пару лишних строк и стать более ясными.

    • Добавьте поддержку отступов.

    Я не думаю, что вы можете сделать это только с помощью колонки. Написание тривиального сценария для этого не слишком сложно.

    Изменить: это может сработать и немного короче. Я попробовал это в оригинальном примере выше, хотя он уже был помещен в колонку. Я заметил, что это приведет к удалению пустых строк, поэтому, если это вызывает беспокойство, это может по-прежнему нуждаться в некоторой полировке.

     #!/bin/bash INPUTFILE="${1}" IFS=$'\r\n' GLOBIGNORE='*'; COMMENTS=(`grep -n ^# "${INPUTFILE}"`) ENTRIES=(`grep -n -v ^# "${INPUTFILE}" | column -t`) TMPTAB=(`printf "%s\n" ${ENTRIES[@]} && printf "%s\n" ${COMMENTS[@]}`) NEWTAB=(`printf "%s\n" ${TMPTAB[@]} | sort -n -t: -k1 | sed 's/^[0-9]\+://'`) printf "%s\n" ${NEWTAB[@]} 

    Я оставлю свой первоначальный ответ здесь, но, как @scott указал, что это не работает для некоторых действительных fstabs.

     #!/bin/bash # columnize the non-comment lines TABS=`grep -v ^# /etc/fstab | column -te` # read the original fstab while read LINE do echo "${LINE}" | grep ^# > /dev/null # if it is a comment line just write it in if [ $? -eq 0 ] then echo "${LINE}" >> new.fstab else # otherwise get the matching entry from the columnized fstab ENTRY=`echo "${LINE}" | awk '{ print $1 }'` echo "${TABS}" | grep ^"${ENTRY}" >> new.fstab fi done < /etc/fstab 

    Как было предложено, вырезать комментарии?

     grep -v "^#" /etc/fstab | column -te 
    Interesting Posts

    не удалось перемонтировать файловую систему в режим «только для чтения» после обновления пакета

    С помощью «find /» пропустите каталоги, такие как «/ proc», «/ sys» и аналогичные

    Диалог – Продолжить в фоновом режиме

    Беспроводной многофункциональный сканер / принтер

    Безопасно ли модифицировать базовый файл, если он установлен losetup?

    Запись полноэкранной программы с помощью avconv / ffmpeg?

    Как перезапустить службу в скрипте bash?

    Как определить псевдоним без выполнения знаков доллара, содержащихся внутри?

    установить mysql – не имеет кандидата на установку

    Онлайн-перезагрузка btrfs корневой файловой системы с различным объемом (снимком)

    Пакеты, не перенаправленные из-за второй таблицы маршрутизации

    Что заменяет mysql – * – 5.6?

    Резервное копирование Ubuntu в качестве установщика

    Окно сообщения GUI в SLES 11

    Проверьте хвост нескольких файлов

    Linux и Unix - лучшая ОС в мире.