내 /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
. /home
and 의 주석을 해제 /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