Bash

註釋 fstab 文件中包含相關 UUID 編號的特定行

  • February 7, 2022

我們要註釋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

您的程式碼的唯一問題是您的變數包含雙引號中的 UUID,而 UUID 中的 UUID/etc/fstab不在引號中。

建議:使用存在的export輸出格式blkid允許你eval輸出,這將設置相關的shell變數,例如UUID。然後$UUID在你的sed命令中使用。

eval "$( blkid -o export /dev/"$Disk" )"

sed -i '/^UUID='"$UUID"'/ s/^/#/' /etc/fstab

這將找到UUID=以您的 UUID 字元串開頭的行。這些行將#在開頭添加一個字元。

由於初始模式固定在行首,因此#如果您重新執行命令,這也可以避免多次添加字元。

僅給出單個表達式-e時不需要該選項,通常在編輯表達式之前給出。sed``-i

你也可以awk像這樣使用 GNU:

awk -i inplace -v uuid="$UUID" '$1 == "UUID=" uuid { $0 = "#" $0 }; 1' /etc/fstab

…考慮到您提供的數據,這將產生相同的效果。它使用inplace自 GNU awk4.1.0 起可用的源模組來執行就地編輯,與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###.

引用自:https://unix.stackexchange.com/questions/687916