fstab에서 모든 UUID를 제거하지만 파일 시스템을 시작한 UUID는 제거하는 방법

fstab에서 모든 UUID를 제거하지만 파일 시스템을 시작한 UUID는 제거하는 방법

다음 예제 파일에서는 단어가 포함된 줄을 제외하고 fstab로 시작하는 모든 줄을 제거하려고 합니다 UUID.UUIDboot

/dev/mapper/VG100-lv_root /                       xfs     defaults        0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot                   xfs     defaults        0 0
/dev/mapper/VG100-lv_var /var                    xfs     defaults        0 0


UUID=0b14011d-f69d-4c4c-8ce0-6240bb0a574a   /var/kafka/mp1                      xfs defaults,noatime 0 0
UUID=2d7872f2-96d4-4ba9-8a17-a1115542645c   /var/kafka/mp2                      xfs defaults,noatime 0 0
UUID=79bdbf56-9a09-4505-ab8e-41ce9432cf0f   /var/kafka/mp3                      xfs defaults,noatime 0 0
UUID=ca42a388-83d4-4f8b-aff7-3450d836eef7   /var/kafka/mp4                      xfs defaults,noatime 0 0
UUID=62d356bb-c393-4a74-bbf9-984b60d3b5c4   /var/kafka/mp5                      xfs defaults,noatime 0 0
UUID=d4071a83-204f-475f-8917-cdd77ef6b1ed   /var/kafka/mp6                      xfs defaults,noatime 0 0

따라서 예외의 결과는 다음과 같아야 합니다.

/dev/mapper/VG100-lv_root /                       xfs     defaults        0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot                   xfs     defaults        0 0
/dev/mapper/VG100-lv_var /var                    xfs     defaults        0 0

지금까지 우리는 다음과 같은 sed를 가지고 있습니다

 sed -i '/^UUID/d'  /etc/fstab

UUID그러나 위의 방법은 모든 행을 삭제합니다

답변1

UUID=첫 번째 필드가 로 시작 하고 두 번째 필드가 그렇지 않은 행을 삭제하려는 것 같습니다 /boot.

따라서 awkPerl의 awk 모드는 확실한 선택처럼 보입니다.

awk '! ($1 ~ /^UUID=/ && $2 != "/boot")' /etc/fstab

(GNU awk는 내부 편집에 사용될 수 있습니다 -i /usr/share/awk/inplace.awk).

perl -lae 'print unless $F[0] =~ /^UUID=/ && $F[1] ne "/boot"' /etc/fstab

( 내부 편집 perl용 ).-i

다음을 사용하여 동일한 작업을 수행할 수 있습니다 sed.

sed '/^[[:space:]]*[^[:space:]]\{1,\}[[:space:]]\{1,\}/boot\([[:space:]].*\)\{0,1\}$/b
     /^[[:space:]]*UUID=/d' /etc/fstab

일부는 (most) 또는 (Macos를 포함한 FreeBSD 및 그 파생물)을 사용하여 sed그 자리에서 편집 할 수 있습니다.-i-i ''


^사용하지 마세요-i inplace현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

답변2

먼저 sed에게 포함된 행을 인쇄하도록 지시 한 다음 구분 기호 표현식을 사용하여 boot포함된 행을 삭제하도록 지시합니다.UUID;

sed -i '/boot/p;/UUID/d' /etc/fstab

인쇄 표현식이 삭제 표현식 앞에 주어지기 때문에 boot가 포함된 행은 UUID가 있는 행이 삭제되기 전에 인쇄됩니다. 이는 표현식 위치를 변경하려는 경우 작동하지 않습니다.

당신이 준 예를 감안할 때 다음과 같은 것을 얻어야합니다

/dev/mapper/VG100-lv_root /                       xfs     defaults        0 0
UUID=735cb76a-51b5-4e06-b6fb-3b9577e38dc5 /boot                   xfs     defaults        0 0
/dev/mapper/VG100-lv_var /var                    xfs     defaults        0 0

^빈 줄을 제거하고, 줄의 시작을 표시하고, $줄의 끝을 표시하는 섹션을 추가할 수도 있으므로 , $줄의 시작 뒤에 줄의 끝이 있는 줄을 제거하는 표현식을 추가하세요 ^.

sed -i '/boot/p;/UUID/d;/^$/d' /etc/fstab


편집하다

Stéphane Chazelas가 주석에서 지적했듯이 UUID가 같은 줄에 포함되지 않은 경우 boot가 포함된 줄이 두 번 인쇄되므로 이와 같은 것이 더 좋을 것입니다.

sed -i '/^UUID/{/boot/!d};/^$/d' /etc/fstab

/boot가 포함되어 있지 않으면 UUID로 시작하는 줄을 삭제한 다음 빈 줄을 삭제합니다.

답변3

많은 가능성이 있습니다. 간단하게 유지하려면 다음을 사용할 수 있습니다.

'/^UUID/{
   /\/boot/b
   d
}'

{}패턴이 일치할 때 실행할 추가 명령을 포함하는 데 사용됩니다 . 부팅이 일치하면 b명령 끝으로 분기하고, 그렇지 않으면 완료합니다 d. 또는,

'/^UUID/{
   /\/boot/!d
}'

시동이 걸린 경우아니요일치하고 삭제합니다. 이러한 패턴은 공백 일치를 통해 향상되어야 하지만 파일에서 예상되는 내용을 이해한다면 아마도 신경 쓰지 않을 것입니다.

한 줄 버전은 일부 버전에서 작동하지 않을 수 있습니다 sed.

'/^UUID/{/\/boot/b;d;}'

그리고

'/^UUID/{/\/boot/!d;}'

답변4

그리고:

perl -i -pe 's@^UUID\S+\s++(?!/boot).*\n@@' /etc/fstab

비슷 -i하다 sed,대기줄

정규식 일치는 다음과 같습니다.

마디 설명하다
^ 문자열의 시작
UUID 'UUID'
\S+ 공백이 아닌 문자(\n, \r, \t, \f 및 " "를 제외한 모든 문자)(1회 이상(최대한 많이 일치))
\s++ 공백(\n, \r, \t, \f 및 " ")은 1회 이상 일치하며 아무것도 반환하지 않습니다.
(?! 시야다음이 있는지 확인하세요.
/boot '/시작'
) 미리보기 끝
.* \n을 제외한 모든 문자(0회 이상(최대한 많이 일치))
\n '\n'(개행 문자)

관련 정보