fstab의 특정 항목에 주석 처리/주석 해제

fstab의 특정 항목에 주석 처리/주석 해제

fstab의 특정 줄에 주석을 달거나 주석 처리를 해제할 수 있는 스크립트를 만들려고 합니다.

매개변수가 경로가 아닌 경우에는 정상적으로 작동합니다.

# add comment
sed -i '/db1/s/^/#DO NOT EDIT THIS LINE /g' /etc/fstab

# remove comment
sed -i '/db1/s/^#DO NOT EDIT THIS LINE //g' /etc/fstab

그러나 슬래시가 포함된 변수를 사용하려고 하면 작동하지 않습니다.

이와 같은 항목이 여러 개인 경우 그 중 몇 가지에 대해서만 의견을 말하고 싶습니다.

/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db1 auto nosuid,nodev,nofail,x-gvfs-show 0 0
/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db2 auto nosuid,nodev,nofail,x-gvfs-show 0 0
/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db3 auto nosuid,nodev,nofail,x-gvfs-show 0 0

다양한 솔루션을 시도했지만 아무것도 작동하지 않습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

감사해요

답변1

이와 같이:

sed -i '/db1/s/^/#/g' /etc/fstab

또는더 강력한 일치:

perl -i -pe 's/^/#/g if m!/oradata/db1!' /etc/fstab

더 강력한 매칭을 원한다면 sed:

sed -i '/oradata\/db1/s/^/#/g' /etc/fstab

산출

#/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db1 auto nosuid,nodev,nofail,x-gvfs-show 0 0
/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db2 auto nosuid,nodev,nofail,x-gvfs-show 0 0
/dev/disk/by-uuid/f40f5a40-4772-479e-9041-330c3afbfb40 /oradata/db3 auto nosuid,nodev,nofail,x-gvfs-show 0 0

답변2

잘 생각했어SED에스다루다응급실ed또는 다음과 같이 더 잘 사용할 수 있습니다 .

ed -s /etc/fstab <<< $'/db1/s/^/#/\n,p'

위의 결과가 좋아 보인다면 pend를 다음으로 바꾸 십시오.w

p= 인쇄 w= 쓰기

모든 항목을 전역적으로 바꾸려면 다음과 같은 명령을 실행할 수 있습니다.

ed -s /etc/fstab <<< $'g/db1/s/^/#/\n,p'

파일에 쓰 p려면 로 다시 바꾸십시오 .w

왜냐하면 이 작업을 수행하려면 다른 방법이 <<<필요하기 때문입니다. bashBourne 쉘을 다음과 함께 사용하십시오.printf

printf '%s\n' 'g/db1/s/^/#/' w q | ed -s /etc/fstab

또는 Bourne 쉘이 없습니다.printf

ed -s /etc/fstab <<!
g/db1/s/^/#/
w
q
!

답변3

꽤 많은 테스트 끝에 문제에 대한 해결책을 찾았습니다.

기본적으로 MOUNTPOINT 변수를 이스케이프 문자가 추가된 마운트 지점 경로가 포함된 다른 변수로 바꿔야 했습니다.

MOUNTPOINTF="${MOUNTPOINT////\\/}

#!/bin/sh

FILE="./fstab"
TAG="#DO NOT EDIT THIS LINE "
COMMAND="do_mount"

f_usage(){
        echo "usage: sudo_mount_oradata1.sh -h"
        echo "       sudo_mount_oradata1.sh -m /oradata1 [-u]"
        exit 1;
}

f_mount() {
        if grep -q "${MOUNTPOINT}" $FILE ; then
                if grep -q "${TAG}" $FILE ; then
                        sed -i.bak "/${MOUNTPOINTF}/s/^${TAG}//g" $FILE
                else
                        echo "INFO: fstab does not contains a commented entry for ${MOUNTPOINT}."
                fi
        else
                echo "INFO: fstab does not contains an entry for ${MOUNTPOINT}."
        fi
}

f_unmount() {
        if grep -q "${MOUNTPOINT}" $FILE ; then
                if grep -q "${TAG}" $FILE ; then
                        echo "INFO: Entry for ${MOUNTPOINT} is already commented in fstab."
                else
                        sed -i.bak "/${MOUNTPOINTF}/s/^/${TAG} /g" $FILE
                fi
        else
                echo "INFO: fstab does not contains an entry for ${MOUNTPOINT}."
        fi
}

while getopts m:u opt
do
    case "$opt" in
                m) MOUNTPOINT="${OPTARG}" ; MOUNTPOINTF="${MOUNTPOINT////\\/}" ;;
                u) COMMAND="do_unmount" ;;
                *) f_usage ;;
        esac
done

clear
# remove leading whitespace from each line
sed -i "s/^[ \t]*//" $FILE

case "$COMMAND" in
        do_mount)   f_mount ;;
        do_unmount) f_unmount ;;
esac

# remove leading whitespace from each line
sed -i "s/^[ \t]*//" $FILE

# debug
echo;
cat $FILE
echo;
ls -lh $FILE*
exit 0

관련 정보