fstabエントリを簡単に並べ替える方法

fstabエントリを簡単に並べ替える方法

テキストエディタで /etc/fstab を編集すると、すべてのスペースが誤ってソートされます。ファイルを見て、スペースを挿入/削除してすべての項目を並べ替えることができますが、より自動化されたソリューションを探しています。理想的には、fstabを入れてすべてを「きれいに」ソートできるオンラインJavaScriptページが必要です。その後、最終結果をファイルにコピーして貼り付けることができます。

類似またはより良い解決策はありますか?

編集:
私はデスクトップ上で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 ドキュメントを使用して再度コピーして貼り付けることができます。

単一のスペースではなくタブを使用してfstabを区切る必要があります。特に、両方を同時に使用する場合、これは不一致を引き起こす可能性があります。

シェルウィンドウが1行のテキスト全体を収めるのに十分な大きさではないため、奇妙に見えます。

関連情報