전체 줄을 일치시켜 /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

/home두 개의 항목이 있습니다 /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

다음 두 명령을 시도했지만 특히 두 번째 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/행이 일치 home하거나 tmp,
    • {s/^#//;t;s/^/#/}#줄의 시작 부분에서 삭제합니다. 존재하지 않는 경우 로 시작하는 줄을 바꿉니다 #.

Awk의 대안

awk '$2 ~ /home|tmp/{ if (!( sub(/^#/, "") )) $1="#"$1} 1' file
  • $2 ~ /(home|tmp)/두 번째 필드에 home또는 이 tmp포함 된 경우
    • if (!( sub(/^#/, "") ))#줄 시작 부분에서 a 를 찾아 제거해 보세요 . 작업이 실패한 경우( #라인에 시작이 없기 때문에)
      • $1="#"$1#줄의 시작 부분에 a를 추가합니다 .
  • 1결과 라인을 인쇄합니다.

Gawk가 있는 경우 플래그를 추가하여 -i inplace파일을 내부에서 편집할 수 있지만 출력을 파일로 리디렉션한 다음 모든 것이 정상인지 확인한 후 원본 파일을 덮어쓰는 것이 더 낫다는 것을 알았습니다.

답변2

특히 여러 호스트에 대해 이 작업을 수행해야 하는 경우 ansible 모듈 lineinfile을 사용하세요.https://docs.ansible.com/ansible/latest/collections/ansible/builtin/lineinfile_module.html

관련 정보