![관련 UUID 번호가 포함된 fstab 파일의 특정 줄을 주석 처리합니다.](https://linux55.com/image/201487/%EA%B4%80%EB%A0%A8%20UUID%20%EB%B2%88%ED%98%B8%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%9C%20fstab%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%ED%8A%B9%EC%A0%95%20%EC%A4%84%EC%9D%84%20%EC%A3%BC%EC%84%9D%20%EC%B2%98%EB%A6%AC%ED%95%A9%EB%8B%88%EB%8B%A4..png)
관련 번호가 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
출력 형식을 사용하세요. 그러면 관련 쉘 변수가 설정됩니다. 예를 들어 명령에 사용하세요.blkid
eval
UUID
$UUID
sed
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
...귀하가 제공한 데이터를 고려하면 동일한 효과가 있습니다. inplace
GNU 4.1.0부터 사용 가능한 소스 모듈을 사용하여 거의 동일한 방식으로 awk
내부 편집을 수행합니다 .sed -i
awk를 사용하여 파일을 변경하는 방법은 무엇입니까? ("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
연산자 시작 부분에 부사를 삽입합니다 .s
s:global///
s:g///
백슬래시 얘기가 나와서 말인데, #
내 특정 시스템에서는 octothorpes를 이스케이프 처리하는 것이 불필요하지만 포함해도 해롭지는 않습니다. 이스케이프된 문소프 vim
(큰따옴표로 묶은 문자열 내)가 포함된 위의 답변을 vim
명령줄(Ex 모드)에서 직접 사용할 수 있으므로 이스케이프된 백슬래시가 포함됩니다 . 예를 들면 다음과 같습니다.
:%! raku -pe 's[ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") ] = "\#\#\#FAULTY_DISK\#\#\#$0";'