관련 UUID 번호가 포함된 fstab 파일의 특정 줄을 주석 처리합니다.

관련 UUID 번호가 포함된 fstab 파일의 특정 줄을 주석 처리합니다.

관련 번호가 fstab포함된 파일의 특정 줄 에 주석을 달고 싶습니다.UUID

예:

Disk=sde
UUID_STRING=`  blkid | grep $Disk | awk '{print $2}' `
echo $UUID_STRING
UUID="86d58af9-801b-4c25-b59d-80b52b4acc61"


sed -e "/$UUID_STRING/ s/^#*/#/" -i /etc/fstab

그러나 에서 /etc/fstab- - 행은 UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /data/sde ext4 defaults,noatime 0 0주석 처리되지 않았습니다.

more /etc/fstab

UUID=cb47ad8e-5b90-4ddc-97f5-2c0fa1f1b7e7 /data/sdc ext4 defaults,noatime 0 0
UUID=169da708-3c48-4306-beba-95dab722d3ab /data/sdd ext4 defaults,noatime 0 0
UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /data/sde ext4 defaults,noatime 0 0
UUID=640e2c41-d5c6-4e02-beb9-714ec99e16e2 /data/sdf ext4 defaults,noatime 0 0
UUID=58a8cddf-7ce9-431c-bb71-f4f44c8d62a5 /data/sdg ext4 defaults,noatime 0 0
UUID=6779c108-f74b-4a05-8faf-cf8752844c53 /data/sdh ext4 defaults,noatime 0 0
UUID=3c2352f6-df8e-4b14-b6c0-60caaef0dce0 /data/sdi ext4 defaults,noatime 0 0
UUID=ba59e473-d856-4c8b-a3be-4bfc40009f0d /data/sdb ext4 defaults,noatime 0 0

--> 무시할 수 있습니까 "? sed 명령에서 - sed -e "/$UUID_STRING/ s/^#*/#/" -i /etc/fstab

다른 솔루션은 다음과 같습니다.

 uuid_capture=`  echo $UUID_STRING | sed s'/"/ /g' | awk '{print $NF}' `
 sed -e "/$uuid_capture/ s/^#*/#/" -i /etc/fstab

more /etc/fstab

UUID=cb47ad8e-5b90-4ddc-97f5-2c0fa1f1b7e7 /grid/sdc ext4 defaults,noatime 0 0
UUID=169da708-3c48-4306-beba-95dab722d3ab /grid/sdd ext4 defaults,noatime 0 0
#UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /grid/sde ext4 defaults,noatime 0 0
UUID=640e2c41-d5c6-4e02-beb9-714ec99e16e2 /grid/sdf ext4 defaults,noatime 0 0
UUID=58a8cddf-7ce9-431c-bb71-f4f44c8d62a5 /grid/sdg ext4 defaults,noatime 0 0
UUID=6779c108-f74b-4a05-8faf-cf8752844c53 /grid/sdh ext4 defaults,noatime 0 0
UUID=3c2352f6-df8e-4b14-b6c0-60caaef0dce0 /grid/sdi ext4 defaults,noatime 0 0
UUID=ba59e473-d856-4c8b-a3be-4bfc40009f0d /grid/sdb ext4 defaults,noatime 0 0

답변1

코드의 유일한 문제는 변수에 큰따옴표로 묶인 UUID가 포함되어 있고 UUID가 /etc/fstab따옴표로 묶여 있지 않다는 것입니다.

권장사항: 출력할 수 있는 기존 export출력 형식을 사용하세요. 그러면 관련 쉘 변수가 설정됩니다. 예를 들어 명령에 사용하세요.blkidevalUUID$UUIDsed

eval "$( blkid -o export /dev/"$Disk" )"

sed -i '/^UUID='"$UUID"'/ s/^/#/' /etc/fstab

UUID=로 시작하는 줄 과 그 뒤에 UUID 문자열이 오는 줄을 찾습니다 . 이 줄의 #시작 부분에는 문자가 있습니다.

초기 패턴은 줄의 시작 부분에 고정되므로 #명령을 다시 실행해도 문자를 여러 번 추가하는 것을 방지할 수 있습니다.

이 옵션은 단일 표현식만 제공되는 경우에는 필요하지 않으며 -e일반적으로 표현식을 편집하기 전에 제공됩니다.sed-i

다음과 같이 GNU를 사용할 수도 있습니다 awk.

awk -i inplace -v uuid="$UUID" '$1 == "UUID=" uuid { $0 = "#" $0 }; 1' /etc/fstab

...귀하가 제공한 데이터를 고려하면 동일한 효과가 있습니다. inplaceGNU 4.1.0부터 사용 가능한 소스 모듈을 사용하여 거의 동일한 방식으로 awk내부 편집을 수행합니다 .sed -iawk를 사용하여 파일을 변경하는 방법은 무엇입니까? ("sed -i"와 동일)).

실제 코드는 첫 번째 필드를 UUID=다음 UUID 문자열과 비교하고, 일치하면 #시작 부분에 a를 추가하여 줄을 수정합니다. 수정 여부에 관계없이 모든 행이 출력 파일로 인쇄됩니다.

이 모든 것은 당신이 일할 수 없다고 가정합니다곧장다음과 같은 것과 함께 /etc/fstab사용됩니다 .$Disk

sed -i '\|^UUID=.* /data/'"$Disk"' | s/^/#/' /etc/fstab

또는

awk -i inplace -v disk="$Disk" '!/^#/ && $2 == "/data/" disk { $0 = "#" $0 }; 1' /etc/fstab

위의 모든 경우에 주석 문자는 #임의의 문자열(예: )이 될 수 있습니다 ###FAULTY_DISK###.

답변2

편집 2:방금 네 눈치를 챘어UUID_STRING변수는 UUID="86d58af9-801b-4c25-b59d-80b52b4acc61"단순한 UUID 문자열이 아닙니다. 먼저 필드 구분 기호 로 사용하라는 -F\"옵션 을 사용하여 변수에 UUID 문자열만 포함하도록 하는 것이 좋습니다 .awk"

UUID_STRING="$( blkid | grep $Disk | awk -F\" '{print $2}' )"
echo $UUID_STRING
86d58af9-801b-4c25-b59d-80b52b4acc61

위의 작업을 수행한 후 fstab이 줄을 주석 처리하는 가장 간단한 방법은 다음과 같습니다 sed "s/^.*$UUID_STRING/#&/" /etc/fstab.(참고: 원래 답변에는 작은따옴표가 있었는데 이는 변수 확장에 올바르지 않았습니다.)

^.*$UUID_STRING일치하는 줄의 시작 부분을 포함하고#&가 앞에 올 것입니다 #.

sed "s/^.*$UUID_STRING/#&/" /etc/fstab
UUID=cb47ad8e-5b90-4ddc-97f5-2c0fa1f1b7e7 /data/sdc ext4 defaults,noatime 0 0
UUID=169da708-3c48-4306-beba-95dab722d3ab /data/sdd ext4 defaults,noatime 0 0
#UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /data/sde ext4 defaults,noatime 0 0
UUID=640e2c41-d5c6-4e02-beb9-714ec99e16e2 /data/sdf ext4 defaults,noatime 0 0
UUID=58a8cddf-7ce9-431c-bb71-f4f44c8d62a5 /data/sdg ext4 defaults,noatime 0 0
UUID=6779c108-f74b-4a05-8faf-cf8752844c53 /data/sdh ext4 defaults,noatime 0 0
UUID=3c2352f6-df8e-4b14-b6c0-60caaef0dce0 /data/sdi ext4 defaults,noatime 0 0
UUID=ba59e473-d856-4c8b-a3be-4bfc40009f0d /data/sdb ext4 defaults,noatime 0 0

작동한다고 확신한다면 -i원본 파일을 덮어쓰는 옵션을 추가하세요.

답변3

GNU sed를 사용하면 다음을 수행할 수 있습니다. 왼쪽의 UUID_STRING 변수는 bash 매개변수 확장으로 연산되고, 오른쪽의 UUID_STRING 변수는 sed 정규식으로 연산되어 주석 처리가 필요한 줄을 분할합니다.

sed -Ei "
  /^UUID=${UUID_STRING#*\"}?/ s/^/#/
" /etc/fstab

답변4

사용행복하다(이전 Perl_6)

raku -pe 's/ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") /\#\#\#FAULTY_DISK\#\#\#$0/;' fstab_test.txt

또는

raku -pe 's[ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") ] = "\#\#\#FAULTY_DISK\#\#\#$0";'

입력 예:

UUID=cb47ad8e-5b90-4ddc-97f5-2c0fa1f1b7e7 /data/sdc ext4 defaults,noatime 0 0
UUID=169da708-3c48-4306-beba-95dab722d3ab /data/sdd ext4 defaults,noatime 0 0
UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /data/sde ext4 defaults,noatime 0 0
UUID=640e2c41-d5c6-4e02-beb9-714ec99e16e2 /data/sdf ext4 defaults,noatime 0 0
UUID=58a8cddf-7ce9-431c-bb71-f4f44c8d62a5 /data/sdg ext4 defaults,noatime 0 0
UUID=6779c108-f74b-4a05-8faf-cf8752844c53 /data/sdh ext4 defaults,noatime 0 0
UUID=3c2352f6-df8e-4b14-b6c0-60caaef0dce0 /data/sdi ext4 defaults,noatime 0 0
UUID=ba59e473-d856-4c8b-a3be-4bfc40009f0d /data/sdb ext4 defaults,noatime 0 0

예제 출력:

UUID=cb47ad8e-5b90-4ddc-97f5-2c0fa1f1b7e7 /data/sdc ext4 defaults,noatime 0 0
UUID=169da708-3c48-4306-beba-95dab722d3ab /data/sdd ext4 defaults,noatime 0 0
###FAULTY_DISK###UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /data/sde ext4 defaults,noatime 0 0
UUID=640e2c41-d5c6-4e02-beb9-714ec99e16e2 /data/sdf ext4 defaults,noatime 0 0
UUID=58a8cddf-7ce9-431c-bb71-f4f44c8d62a5 /data/sdg ext4 defaults,noatime 0 0
UUID=6779c108-f74b-4a05-8faf-cf8752844c53 /data/sdh ext4 defaults,noatime 0 0
UUID=3c2352f6-df8e-4b14-b6c0-60caaef0dce0 /data/sdi ext4 defaults,noatime 0 0
UUID=ba59e473-d856-4c8b-a3be-4bfc40009f0d /data/sdb ext4 defaults,noatime 0 0

위 내용은 Perl 계열의 프로그래밍 언어인 Raku로 작성된 답변입니다. Raku는 제한된 수의 명령줄 플래그를 구현합니다. -pe여기서는 (자동 인쇄, 코드 실행) 플래그가 사용됩니다. 두 답변 모두 Raku의 s///대체 연산자를 사용합니다. 두 번째 예 s[…] = "…"는 더 새로운(백슬래시가 없는) 변형입니다. 전역 일치가 필요한 경우 또는 와 같이 :global연산자 시작 부분에 부사를 삽입합니다 .ss:global///s:g///

백슬래시 얘기가 나와서 말인데, #내 특정 시스템에서는 octothorpes를 이스케이프 처리하는 것이 불필요하지만 포함해도 해롭지는 않습니다. 이스케이프된 문소프 vim(큰따옴표로 묶은 문자열 내)가 포함된 위의 답변을 vim명령줄(Ex 모드)에서 직접 사용할 수 있으므로 이스케이프된 백슬래시가 포함됩니다 . 예를 들면 다음과 같습니다.

:%! raku -pe 's[ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") ] = "\#\#\#FAULTY_DISK\#\#\#$0";' 

관련 정보