行全体を一致させて、/etc/fstabで行のコメントを解除してコメントする方法は?

行全体を一致させて、/etc/fstabで行のコメントを解除してコメントする方法は?

私の/etc/fstabファイルに次の行があります。

#
# /etc/fstab
# Created by anaconda on Sun Aug 23 14:32:22 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rootvg-rootlv /                       xfs     defaults        0 0
UUID=af74c8xz-e6ec-2387-b2xe-cdc32519a69f /boot                   xfs     defaults        0 0
UUID=GH4E-B04C          /boot/efi               vfat    defaults,uid=0,gid=0,umask=0077,shortname=winnt 0 0
#/dev/mapper/rootvg-homelv /home                   xfs     defaults        0 0
/dev/mapper/rootvg-optlv /opt                    xfs     defaults        0 0
#/dev/mapper/rootvg-tmplv /tmp                    xfs     defaults        0 0
/dev/mapper/rootvg-usrlv /usr                    xfs     defaults        0 0
/dev/mapper/rootvg-varlv /var                    xfs     defaults        0 0
/dev/mapper/rootvg-homelv /home                   xfs    nodev        1 2
/dev/mapper/rootvg-tmplv /tmp                    xfs    defaults,nodev,nosuid,noexec        1 2
tmpfs /dev/shm tmpfs nodev,nosuid,noexec 0 0
UUID=34g5et-fg55-40er-bx8u-9fhe47f986ab   /datadisk   ext4   defaults,nofail   1   2
/dev/disk/cloud/azure_resource-part1    /mnt    auto    defaults,nofail,x-systemd.requires=cloud-init.service,comment=cloudconfig       0       2

/home2つの項目があります/tmp/homeandのコメントを外し/tmp、他の行と行/homeをコメントアウトする必要があります/tmp

したがって、最終ファイルは次のようになります。

#
# /etc/fstab
# Created by anaconda on Sun Aug 23 14:32:22 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rootvg-rootlv /                       xfs     defaults        0 0
UUID=af74c8xz-e6ec-2387-b2xe-cdc32519a69f /boot                   xfs     defaults        0 0
UUID=GH4E-B04C          /boot/efi               vfat    defaults,uid=0,gid=0,umask=0077,shortname=winnt 0 0
/dev/mapper/rootvg-homelv /home                   xfs     defaults        0 0
/dev/mapper/rootvg-optlv /opt                    xfs     defaults        0 0
/dev/mapper/rootvg-tmplv /tmp                    xfs     defaults        0 0
/dev/mapper/rootvg-usrlv /usr                    xfs     defaults        0 0
/dev/mapper/rootvg-varlv /var                    xfs     defaults        0 0
#/dev/mapper/rootvg-homelv /home                   xfs    nodev        1 2
#/dev/mapper/rootvg-tmplv /tmp                    xfs    defaults,nodev,nosuid,noexec        1 2
tmpfs /dev/shm tmpfs nodev,nosuid,noexec 0 0
UUID=34g5et-fg55-40er-bx8u-9fhe47f986ab   /datadisk   ext4   defaults,nofail   1   2
/dev/disk/cloud/azure_resource-part1    /mnt    auto    defaults,nofail,x-systemd.requires=cloud-init.service,comment=cloudconfig       0       2

次の2つのコマンドを試しましたが、特に2番目のコマンドsedでより多くの一致を見つけたので、必要なものよりも多くの行をコメントアウトしました。

sed -i '/defaults,nodev,nosuid,noexec/ s/^/#/' /etc/fstab
sed -i '/nodev/ s/^/#/' /etc/fstab

この目標を達成する方法は?

ベストアンサー1

GNU Sedメソッド、

sed -Ei '/home|tmp/{s/^#//;t;s/^/#/}' file
  • /home|tmp/行が一致するhometmp
    • {s/^#//;t;s/^/#/}#行の先頭から削除します。存在しない場合から始まる行を置き換えます#

Awkの代替

awk '$2 ~ /home|tmp/{ if (!( sub(/^#/, "") )) $1="#"$1} 1' file
  • $2 ~ /(home|tmp)/2番目のフィールドに、homeまたはがtmp含まれている場合
    • if (!( sub(/^#/, "") ))#行の先頭でaを見つけて削除します。ジョブが失敗した場合(#行に開始がないため)
      • $1="#"$1#行の先頭にaを追加します。
  • 1結果行を印刷します。

Gawkがある場合は、フラグを追加して-i inplaceファイルを内部で編集できますが、出力をファイルにリダイレクトし、すべてが正常であることを確認してから元のファイルを上書きする方が良いことに気づきました。

おすすめ記事