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

proc является виртуальной файловой системой, таким образом, я не полагался бы ни на какую информацию о статусе файла.

Время начала процесса расположено в/proc/PID/stat столбце 22. Это дано в миге после начальной загрузки системы. Для преобразования его в секунды, необходимо разделить его на sysconf(_SC_CLK_TCK) который является 100 для большинства систем (но не все!).

Для получения времени начальной загрузки системы, Вы определяете текущее время работы в секундах, которое является первым значением/proc/uptime.

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

Пример (для гибридного языка):

PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

Примечание: этот простой пример не работает если pidof возвраты multipe PIDs.

6
15.10.2013, 17:10
5 ответов

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

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
6
27.01.2020, 20:24
  • 1
    Та команда завинчивает все мои комментарии fstab, но кроме которого, она делает точно, что я ищу. :) –  Sepero 15.10.2013, 02:00
#!/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")
2
27.01.2020, 20:24

Править:

А-ч, не заметил Ваше редактирование 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"

Vim:

Вы могли использовать сценарий Vim. Это - переписывание от подобной вещи...

  • Добавляет новая команда :FmtFstab
  • Строки комментария, запускающиеся с волшебства #= также отформатирован. (Таким образом, если Вы комментируете 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()
1
27.01.2020, 20:24

Я на самом деле не предпочитаю выравнивания вообще (просто одиночный пробел). Но это - интересная проблема. Интересно почему 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
1
27.01.2020, 20:24

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

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

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

0
27.01.2020, 20:24
  • 1
    Спасибо за Ваш ответ. Я думаю, возможно, что я немного неправильно понимаюсь. Способность моего требуемого решения отредактировать fstab была бы дополнительной. Основная вещь, которую я ищу его, чтобы сделать, выравнивают все столбцы. У меня нет проблемы при редактировании fstab. Я был бы точно так же, как что-то для "чистки его", когда я закончен. –  Sepero 15.10.2013, 01:15
  • 2
    При использовании клавиши Tab при интервале столбцов не должно быть никакой потребности очистить что-либо, потому что столбцы уже будут выровненные. Я работаю со многими серверами, и все столбцы на всем fstabs выравниваются, потому что я использую вкладку для хранения интервала того же. Я не вижу цели приложения сделать что-то, что это уже делается. Извините я не мог помочь больше. А-ч –  Jeight 15.10.2013, 01:21
  • 3
    да, я вижу то, что Вы имеете в виду. Используя вкладки для выравнивания столбцов было бы быстрее, чем пробелы, но для любого столбца дольше, чем 8 символов, это все еще требует ручной фиксации выравнивания. Таким образом, это - то, чего я стараюсь избегать.Я признателен за Вашу помощь. –  Sepero 15.10.2013, 01:26

Теги

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