linux + bashスクリプトを介してfstabファイルで使用されていないか、無効なUUID番号を削除します。

linux + bashスクリプトを介してfstabファイルで使用されていないか、無効なUUID番号を削除します。

/etc/fstab私たちの目標は、ファイルから未使用または不要なUUID番号を削除するbashスクリプトを作成することです。

シンプルな背景- 私たちの研究室には500以上のRHELサーバーがあり、未使用のUUID番号やコメント行の未使用のUUID番号など、誤った設定のファイルをfstab修正しようとしています。fstab

例として、次のbashスクリプトを作成します。

#!/bin/bash


blkid_list_of_uuid=` blkid | awk -F'UUID=' '{print $2}' | awk '{print $1}' | sed s'/"/ /g' `
grep UUID /etc/fstab >/tmp/fstab

while read line_from_fstab
do
        echo "checking if ${line_from_fstab} is unused UUID"
        if [[ ! ${line_from_fstab} =~ $blkid_list_of_uuid ]]
        then
           #sed -i "/$line_from_fstab/d" /etc/fstab
           echo "delete unused line ${line_from_fstab} from fstab"
        fi
done < /tmp/fstab

blkid変数に数字をキャプチャしましたblkid_list_of_uuid。 fstabのUUID行を/tmp/fstabファイルにフィルタリングします。

if構文の目的は、sedを介して未使用のUUID行を[[ ! ${line_from_fstab} =~ $blkid_list_of_uuid ]] 削除することです(現在のコメントから)。/etc/fstab

しかし、正規表現は機能しません。スクリプトは実際に使用されているUUIDを削除します。

ブキッドの例

blkid
/dev/mapper/vg-VOL_root: UUID="49232c87-6c49-411d-b744-c6c847cfd8ec" TYPE="xfs"
/dev/sda2: UUID="Y5MbyB-C5NN-hcPA-wd9R-jmdI-02ML-W9qIiu" TYPE="LVM2_member"
/dev/sda1: UUID="0d5c6164-bb9b-43f4-aa9b-092069801a1b" TYPE="xfs"
/dev/mapper/vg-VOL_swap: UUID="81140364-4b8e-412c-b909-ef0432162a45" TYPE="swap"
/dev/mapper/vg-VOL_var: UUID="e1574eeb-5a78-4a52-b7e3-c53e2b8a4220" TYPE="xfs"
/dev/sdb: UUID="547977e2-a899-4a75-a31c-e362195c264c" TYPE="ext4"
/dev/mapper/vg-VOL_docker: UUID="2e1a2cbf-9920-4e54-8b6b-86d0482c5f7b" TYPE="xfs"
/dev/sdc: UUID="1a289232-0cfe-4df7-9ad5-6a6e2362a1c5" TYPE="ext4"
/dev/sdd: UUID="91493d1f-ffe9-4f5f-aa6d-586d2c99f029" TYPE="ext4"
/dev/sde: UUID="f11845e7-1dcb-4b81-a1d4-9a5fe7da6240" TYPE="ext4"

ベストアンサー1

うまくいかないのは、間違ったものを一致させようとしているからです。変数に含まれる内容は次のとおりですblkid

$ printf '%s\n' "$blkid_list_of_uuid"
 49232c87-6c49-411d-b744-c6c847cfd8ec 
 Y5MbyB-C5NN-hcPA-wd9R-jmdI-02ML-W9qIiu 
 0d5c6164-bb9b-43f4-aa9b-092069801a1b 
 81140364-4b8e-412c-b909-ef0432162a45 
 e1574eeb-5a78-4a52-b7e3-c53e2b8a4220 
 547977e2-a899-4a75-a31c-e362195c264c 
 2e1a2cbf-9920-4e54-8b6b-86d0482c5f7b 
 1a289232-0cfe-4df7-9ad5-6a6e2362a1c5 
 91493d1f-ffe9-4f5f-aa6d-586d2c99f029 
 f11845e7-1dcb-4b81-a1d4-9a5fe7da6240 

これは次のことを意味します。

if [[ ! ${line_from_fstab} =~ $blkid_list_of_uuid ]]

次のようになります。

if [[ ! "UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4   defaults  0      1" =~ " 49232c87-6c49-411d-b744-c6c847cfd8ec 
 Y5MbyB-C5NN-hcPA-wd9R-jmdI-02ML-W9qIiu 
 0d5c6164-bb9b-43f4-aa9b-092069801a1b 
 81140364-4b8e-412c-b909-ef0432162a45 
 e1574eeb-5a78-4a52-b7e3-c53e2b8a4220 
 547977e2-a899-4a75-a31c-e362195c264c 
 2e1a2cbf-9920-4e54-8b6b-86d0482c5f7b 
 1a289232-0cfe-4df7-9ad5-6a6e2362a1c5 
 91493d1f-ffe9-4f5f-aa6d-586d2c99f029 
 f11845e7-1dcb-4b81-a1d4-9a5fe7da6240 
" ]]

もちろん、これは決して真実ではありません。fstab見つかったUUIDのリストから行全体を検索しています。あなたが望むのはOneを見つけるだけですUUID

これをしないでください。他の回答で提供されている方法の1つを使用して、シェルを使用してこれらのタスクを処理します。悪い考えだしかし、完全性を期すためにここで使用したいロジックを使用するほとんどのシェルベースのアプローチがあります(ここではGNUが必要ですgrep)。

$ grep -oP '^UUID=\S+' /etc/fstab | sed 's/=/="/; s/$/"/' | 
  while read -r fstab; do 
    sudo blkid |   
      grep -q "$fstab" && 
        echo "GOOD: $fstab" || 
          echo "BAD: $fstab"; done
BAD: UUID="e16a3de8-a58f-430f-b80f-3d87e9fb0b1d"
BAD: UUID="ef6747e2-f802-4b18-9169-ae65f9933ef1"
BAD: UUID="b00792c8-f7e0-4448-b98d-021eede31e6c"
GOOD: UUID="32133dd7-9a48-4b9d-b2e0-6e383e95631d"
GOOD: UUID="69ae5a79-9a15-489c-951d-1e0c2a16b7fc"
GOOD: UUID="6E5E-90F0"
GOOD: UUID="ff3c9de1-417c-4c4d-8150-a89d222ae60b"

これはBAD:私のファイルのUUIDですが、/etc/fstab私のシステムの出力には見つかりません。blkid

おすすめ記事