私は私たちのシステムのいくつかを強化しています。強化プロセスの一環として、特定のパーティションの機能を制限するために/ 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