fstabからすべてのUUIDを削除しますが、ファイルシステムを起動したUUIDを削除する方法

fstabからすべてのUUIDを削除しますが、ファイルシステムを起動したUUIDを削除する方法

次のサンプルファイルでは、単語を含む行を除いて、で始まるすべてのfstab行を削除しようとしていますUUIDUUIDboot

/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=最初のフィールドがで始まり、2番目のフィールドがそうでない行を削除したいようです/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現在の作業ディレクトリから最初に拡張機能を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を含む行が2回印刷されるため、このような方が良いでしょう。

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

/bootが含まれていない場合は、UUIDで始まる行を削除してから空の行を削除します。

答え3

多くの可能性があります。簡単にするには、次のものを使用できます。

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

{}パターンが一致したときに実行する追加のコマンドを含めるために使用されます。起動が一致した場合はbコマンドの最後に分岐し、それ以外の場合は完了しますd。または、

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

始動がかかった場合いいえ一致して削除します。これらのパターンはスペースマッチングで改善する必要がありますが、ファイル内の期待される内容を理解している場合はおそらく気にしません。

1行バージョンは一部のバージョンでは機能しない場合があります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' (改行文字)

関連情報