sed: /etc/fstab の項目の置き換え

sed: /etc/fstab の項目の置き換え

私は私たちのシステムのいくつかを強化しています。強化プロセスの一環として、特定のパーティションの機能を制限するために/ etc / fstabのいくつかのエントリを更新する必要がありました。

しかし、sedインライン置換を使用して行を更新できることを願っています。以下は/ etc / fstabの現在の部分です:

# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg1-lv_home /home                   ext4    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0

sedコマンドを実行した後、ファイルは次のようになります。

# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg1-lv_home /home                   ext4    defaults,nodev        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0

デフォルトでは、ext [2-4]のすべての行(ルートパーティションではない)に "nodev"を追加する必要があります。

私が設定したsedコマンドはほとんどこれを行いましたが、何らかの理由で "/"パーティションと一致しない正規表現を取得できないため、常にその行も更新されます。

sed '/^[^#].*ext[2-4]/s/defaults/defaults,nodev/g' /etc/fstab

vg1-lv_rootではなく空白で囲まれた「/」を閉じたいです。以下はうまくいきますが、この解決策はあいまいなので気に入らません。

sed '/^[^#].*ext[2-4]/s/defaults/defaults,nodev/g' /etc/fstab | sed '/^[^#].*root.*ext[2-4]/s/defaults,nodev/defaults/' > /etc/fstab

答え1

awk追加のロジックを使用して文字列を追加し、column最終出力ファイルの形式を再指定できます。/etc//tmp/フォルダへの書き込み権限があるとします。

tempfile=$(mktemp /tmp/tmpfile.XXXXXXXX)

/tmp/awkこれにより、出力を記録して元のファイルにリダイレクトできるパスに一時ファイルが作成されます。

awk '$3 ~ "ext[2-4]"{ $4=$4",nodev" }1 ' /etc/fstab | column -t > "$tempfile" && mv -- "$tempfile" /etc/fstab

そのcolumn -t部分は単に冗長であり、出力ファイルをクリーンアップせず、かさばるようにするのではなく、読みやすくするために必要です。

答え2

より簡単な方法は次のとおりですsed

$ sed -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab 
# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg1-lv_home /home                   ext4    defaults,nodev        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0

秘密は、空白の後にa/と1つ以上の空白以外の文字(\s/\S+)が続く場合を探し、次にext[2-4]空白(\s+ext[2-4])、余分な空白、およびがある場合を探すことですdefaults。これはあなたが興味のあるケースとのみ一致するべきです。したがって、一致するものがある場合は、一致全体を独自のプラスnodev:に置き換えてください\1,nodev

ただ、携帯性がどれほど良いかはよくわかりません。-E多くの実装は拡張正規表現をサポートしていますsedが、POSIXではありません。より移植性の高いアプローチのために、Perlで同じアイデアを試してみてください。

$ perl -pe 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab 
# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg1-lv_home /home                   ext4    defaults,nodev        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0

どちらの場合も、ファイルをその場で編集するには、次のようにします-i

perl -i -pe 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab 
sed -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab 

またはBSDまたはOSXの場合sed

sed -i '' -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab 

上記は、このdefaultsオプションが唯一のオプションであるか、少なくとも最後のオプションであると想定しています。そんなことがあったら失敗したでしょうnodev,defaults

答え3

もちろん、質問を投稿してから10分後、ついに次のコマンドを使って私が望むことをすることができました。

sed -r '/^[^#].*[ \t]+\/[^[:space:]].*ext[2-4]/s/defaults/defaults,nodev/g' /etc/fstab

誰もがより明確または簡単な答えを持っている場合は、聞きたいです。ありがとうございます!

答え4

除外された試合はメンテナンスが困難です。目的のパーティションのみを一致させる方が安全です。そして、1行だけが一致する場合は、後ろに「g」は必要ありません。

sed -r 's#(/home\s.*defaults)\s#\1,nodev #' /etc/fstab 

関連情報