/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
答え2
サンプル入力と期待される出力がなければ、これはテストされていない推測ですが、awkを使ってこれが欲しいものだと思います。
#!/usr/bin/env bash
tmp=$(mktemp) || exit 1
trap 'rm -f "$tmp"; exit' EXIT
blkid |
awk '
NR == FNR {
gsub(/"/,"",$2)
blkids[$2]
next
}
!/^UUID/ || ($1 in blkids)
' - /etc/fstab > "$tmp" &&
mv -- "$tmp" /etc/fstab
上記のblkid
出力形式は次のとおりです。https://linux.101hacks.com/unix/blkid:
/dev/sdb1: UUID="6e0acfe3-81ed-4f9f-8ab5-0d65ba1f0ef2" TYPE="ext2"
/dev/sdc1: UUID="aa82d7bb-ab2b-4739-935f-fd8a5c9a6cb0" TYPE="ext2"
/dev/sda1: UUID="187171ab-c9b8-43ec-b0bb-77c736ca22e0" TYPE="ext4" LABEL="/home"
/dev/sda2: UUID="1a225baa-7027-4619-aaa5-900e24c1fdff" TYPE="swap"
/dev/sdb3: UUID="2a294b33-eb61-40a3-b3fc-ad6eaf7f156f" TYPE="ext2"
/etc/fstab
コンテンツ形式は次のとおりです。https://wiki.archlinux.org/title/fstab:
# <device> <dir> <type> <options> <dump> <fsck>
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 / ext4 defaults 0 1
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none swap defaults 0 0
UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /home ext4 defaults 0 2
Google検索ですばやく見つけました。
答え3
UUIDリストを正規表現として使用できるかどうかはわかりません。
このリストを得るために私が使用した
blkid | awk -F\" '{for(i=1;i<=NF;i++) if ($i ~ / UUID=/ ) { i++; print $i ; break ; } }'
どこ
-F\"
"
区切り文字として使用for(i=1;i<=NF;i++)
痕跡if ($i ~ / UUID=/ )
UUID =が見つかった場合(spaceUUIDが必須である前に)...{ i++ ; print $i ; break ; } }'
..次のフィールド(実際のUUID)を取得して印刷し、ループを終了します。
次に一般を使用します。grep
if ! echo "${blkid_list_of_uuid}" | grep ${line_from_fstab}
(廃棄物を減らすために使用できますgrep -q
)
これにより
blkid_list_of_uuid=$(blkid | awk -F\" '{for(i=1;i<=NF;i++) if ($i ~ / UUID=/ ) { i++ ; print $i ; break ; } }' )
grep UUID /etc/fstab >/tmp/fstab
while read line_from_fstab
do
echo "checking if ${line_from_fstab} is unused UUID"
if ! echo "${blkid_list_of_uuid}" | grep ${line_from_fstab}
then
#sed -i "/$line_from_fstab/d" /etc/fstab
echo "delete unused line ${line_from_fstab} from fstab"
fi
done < /tmp/fstab
awk
2本と1本をパイプで接続することはほとんどありません。sed
blkid_list_of_uuidは一時ファイルに保存することもできます。grep -q ${line_from_fstab} /tmp/blkid_list_of_uuid
(uuidではないので動作しません
${line_from_fstab}
)指摘したように、500台の仮想マシンにbashスクリプトをデプロイして実行することは、おそらく長期的には良い考えではありません。私はansibleを考慮したいと思います。
答え4
terdonが答えた。何が間違っていますか?実行したいタスクを実行するより簡単な方法の例を示します。
lsblk -no uuid | grep . | grep -Ff- /etc/fstab
これにより、fstabが目的の方法で出力されます。違いは、UUIDを正規表現や潜在的なsed
コマンドのように処理しないことです。出力をに送信して/tmp/fstab
から移動できます/etc/fstab
。
マンページで代わりに提案したので、lsblk
notを使用し、明らかにroot権限は必要ありませんでした。blkid
blkid
lsblk
lsblk
blkid