fstab 항목을 쉽게 정렬하는 방법

fstab 항목을 쉽게 정렬하는 방법

텍스트 편집기로 /etc/fstab을 편집하면 모든 공백이 잘못 정렬됩니다. 파일을 살펴보고 공백을 삽입/제거하여 모든 항목을 정렬할 수 있지만 보다 자동화된 솔루션을 찾고 있습니다. 이상적으로는 fstab을 넣고 모든 것을 "예쁘게" 정렬할 수 있는 온라인 자바스크립트 페이지가 있어야 합니다. 그런 다음 최종 결과를 다시 파일에 복사하여 붙여넣을 수 있습니다.

유사하거나 더 나은 솔루션이 있습니까?

편집:
저는 데스크탑에서 Linux를 사용하고 있으며 단지 fstab을 편집하기 위해 vi나 emacs를 추가할 생각은 없습니다. 어떤 사람들에게는 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

답변1

나는 열을 멋진 테이블에 정렬하는 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

답변2

#!/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")

답변3

편집하다:

아, 난 당신을 눈치채지 못했어요빔 없음지금까지 편집중입니다.

또 다른 방법은 이와 같은 것을 스크립트에 넣는 것입니다.

문제는 다음과 같습니다.

  1. 항목만 추출하고 주석이 있는 곳에는 빈 줄을 남겨 둡니다.
  2. 이것을 파이프 column하고 -e빈 줄을 보존하는 데 사용하고 임시 파일 1에 저장합니다.
  3. 2. 댓글을 추출하여 임시파일에 저장합니다.
  4. paste파일을 병합하여 -d'\0'선행 공백을 버리려면 with를 사용하십시오.

파일에 저장 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 스크립트를 사용할 수 있습니다. 비슷한 내용을 다시 쓴 글입니다...

  • 새 명령 추가: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()

답변4

Vim이나 emacs가 작동해야 합니다. 도대체 nano라도 fstab을 올바르게 표시해야 합니다. 텍스트 편집기 GUI를 사용하려면 gedit를 사용해 볼 수 있습니다. fstab을 온라인 편집기에 넣고 싶다면 Google 문서를 사용하고 다시 복사하여 붙여넣을 수 있습니다.

단일 공백이 아닌 탭을 사용하여 fstabs를 구분해야 합니다. 특히 동시에 두 가지를 모두 사용하는 경우 이로 인해 불일치가 발생할 수 있습니다.

쉘 창이 한 줄의 전체 텍스트를 담을 만큼 충분히 크지 않기 때문에 이상하게 보일 수 있습니다.

관련 정보