サーバーを設定するためにbashスクリプトをnoatime
追加したいです。fstab
/
パーティションに対してのみ安全な方法で自動化するにはどうすればよいですか?
簡単に言うと:
その行にまだbash / shellコードを使用しているものが含まれていない場合は、,noatime
2行目の文字列をその行の4番目の文字列に追加するにはどうすればよいですか?/
noatime
サンプルファイル:
# Comment
UUID=1234567890-abcdef / ext4 defaults,discard 0 1
UUID=9876543210-fedcdab /var ext4 defaults,discard 0 0
得るべきこと:
# Comment
UUID=1234567890-abcdef / ext4 defaults,discard,noatime 0 1
UUID=9876543210-fedcdab /var ext4 defaults,discard 0 0
答え1
これにより、目的の効果を得ることができます。
awk -i inplace '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab
これはあなたが要求したよりも少し具体的です。次の,noatime
場合、4番目のフィールドに追加されます。その分野まだ含まれていないnoatime
、行全体をチェックしません。
-i inplace
Gawk専用です。サポートされていない場合、結果は新しいファイルに書き込まれます。
awk '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab > /etc/fstab.new && mv /etc/fstab{.new,}
どちらの場合も、サーバー設定スクリプトがルートとして実行されていると仮定します。
(ありがとうございます。エドモートン強力なテキスト置換のために!を使用すると、4番目のフィールドの正規表現に関連する潜在的な問題を回避できますsub
。 )
答え2
$ perl -p -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
# Comment
UUID=1234567890-abcdef / ext4 defaults,noatime,discard 0 1
UUID=9876543210-fedcdab /var ext4 defaults,discard 0 0
正規表現に一致する行m:^[^#]+\s+/\s+:
(たとえば、スペースで囲まれた/いいえ前に#
コメントがある)と一致しない場合は、挿入される行noatime
を修正します,noatime
。
注:これは,noatime
背面defaults
ではなく背面に挿入されますdiscard
。私の考えにはこれがdefaults
ほぼ確実に存在するので(discard
とにかくそれよりも可能性が高い)、より意味があると思います。
これは練習の実行を行います。つまり、変更せずに./fstab
標準出力に実行する操作のみを表示します。実際にファイルを変更するには、Perlの-i
オプションを使用します。
perl -p -i -e 'm:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
もちろん、./fstabを/etc/fstabに変更します。
atime
ところで、、relatime
などの既存のインスタンスも変更するには、nodiratime
ステートメントを追加します。最初。例えば
perl -p -e 'm:^[^#]+\s+/\s+: && /^[^#]+atime/ && s/([,\s])[^,\s]*atime/noatime/;
m:^[^#]+\s+/\s+: && ! /noatime/ && s/defaults/$&,noatime/' ./fstab
答え3
拡張正規表現モード(-E)で実行されているGNU sedを使用してこれを実行できます。 2番目のフィールドが単一のスラッシュ「/」で、4番目のフィールドにまだ完全な単語「noatime」が含まれていない行を確認し、それを4番目の単語に追加します。
sed -E -e '
\:^\s*\S+\s+/\s:!b
s/\S+/\n&\n/4
/\n(.*,)?noatime(,.*)?\n/!s/\n/,noatime/2
s/\n//g
' /etc/fstab