関連するUUID番号を含むfstabファイルの特定の行をコメントアウトします。

関連するUUID番号を含むfstabファイルの特定の行をコメントアウトします。

関連番号を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

答え1

コードの唯一の問題は、変数に二重引用符で囲まれたUUIDが含まれており、UUIDが引用符/etc/fstabで囲まれていないことです。

推奨事項:出力できる既存のexport出力形式を使用してください。これにより、関連するシェル変数が設定されます。たとえば、コマンドに使用します。blkidevalUUID$UUIDsed

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

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

UUID=で始まる行とそれに続くUUID文字列が続く行を探します。この行の#先頭には文字があります。

初期パターンは行の先頭に固定されているため、#コマンドを再実行しても文字を複数回追加するのを防ぎます。

このオプションは、単一の式のみが提供される場合は必要ではなく、-e通常は式を編集する前に提供されます。sed-i

次のようにGNUを使用することもできますawk

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

...あなたが提供したデータを考慮すると、同じ効果があります。inplaceGNU 4.1.0以降、利用可能なソースモジュールを使用して、ほぼ同じ方法でawk内部編集を実行します。sed -iawkを使ってファイルを変更する方法は? ("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###

答え2

編集2:今あなたの気づいたUUID_STRING変数はUUID="86d58af9-801b-4c25-b59d-80b52b4acc61"単純なUUID文字列ではありません。まず、フィールド区切り文字として使用する-F\"オプションを使用して、変数にUUID文字列のみを含めることをお勧めします。awk"

UUID_STRING="$( blkid | grep $Disk | awk -F\" '{print $2}' )"
echo $UUID_STRING
86d58af9-801b-4c25-b59d-80b52b4acc61

上記の操作を行った後、fstabこの行をコメントアウトする最も簡単な方法は次のとおりですsed "s/^.*$UUID_STRING/#&/" /etc/fstab(注:元の答えには一重引用符がありましたが、変数の拡張には正しくありませんでした。)

^.*$UUID_STRING一致する行の先頭を含み、#&が前に来ます#

sed "s/^.*$UUID_STRING/#&/" /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

うまくいくと思われる場合は、-i元のファイルを上書きするオプションを追加してください。

答え3

GNU sedを使用すると、次のことができます。左側のUUID_STRING変数はbashパラメータ拡張として操作され、右側のUUID_STRING変数はsed正規表現として計算され、コメントアウトが必要な行を分割します。

sed -Ei "
  /^UUID=${UUID_STRING#*\"}?/ s/^/#/
" /etc/fstab

答え4

使用幸せ(以前のPerl_6)

raku -pe 's/ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") /\#\#\#FAULTY_DISK\#\#\#$0/;' fstab_test.txt

または

raku -pe 's[ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") ] = "\#\#\#FAULTY_DISK\#\#\#$0";'

入力例:

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

出力例:

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
###FAULTY_DISK###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

上記は、Perlシリーズのプログラミング言語であるRakuで書かれた答えです。 Rakuは限られた数のコマンドラインフラグを実装します。-peここでは、(自動印刷、コード実行)フラグが使用されます。どちらの答えも、Rakuのs///代替演算子を使用します。 2番目の例s[…] = "…"は、より新しい(バックスラッシュのない)バリエーションです。グローバルマッチングが必要な場合など、 :global演算子の先頭に副詞を挿入します。ss:global///s:g///

バックスラッシュの話が出てきたので、#私の特定のシステムではoctothorpesをエスケープする必要はありませんが、含めても有害ではありません。エスケープされた文ソフvim(二重引用符で囲まれた文字列内)を含む上記の答えは、vimコマンドライン(Exモード)で直接使用できるため、エスケープされたバックスラッシュが含まれます。たとえば、次のようになります。

:%! raku -pe 's[ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") ] = "\#\#\#FAULTY_DISK\#\#\#$0";' 

関連情報