Linuxに/tmp/volume.logファイルがあります。内容は次のとおりです。
[id:1091666, name:root, deviceName:/dev/sda, maxStorage:107374182400, unitNumber:0, displayOrder:0, rootVolume:true],[id:1091851, name:/var/log/devops|40GB;/home/devops|150GB, deviceName:/dev/sdb, maxStorage:289910292480, unitNumber:1, displayOrder:1, rootVolume:false]],
一行になります。このファイルは他のスクリプトによって生成されます。
私の目標は、OSビルド時にルートではなくボリュームディスクを見つけ、LVMコマンドを変数に解析して新しいボリュームを拡張または作成することです。
上記の例では。
2つのディスクがあります。 1 - sdaはルートディスクです(rootVolumeがtrueの場合はルートディスクです)。 2 - sdbはroot以外のディスクです(rootVolumeがfalseの場合はrootではありません)。
ただgrepすればいい
ルートボリューム=false
それからgrep
デバイス名: /dev/sdb
以下は:
名前:/var/log/devops|40GB;/home/devops|150GB
上記のすべてを変数に解析すると、次のコマンドでこれらの変数を呼び出すことができます。
#!/bin/bash
Disk_name=/dev/sdb
Size_Value=40G
LV_name=var_log_devops
Mount_Point=/var/log/devops
sudo pvcreate $Disk_name
sudo vgcreate vgrp01 $Disk_name
sudo lvcreate -L $Size_Value -n $var_log_devops vgrp01
sudo mkfs.xfs $var_log_devops
sudo mkdir -p $/var/log/devops
sudo mount $var_log_devops $/var/log/devops
これで、テキストファイルから値を抽出することが1行にあり、複数の区切り文字があるため、ショックを受けました。
ベストアンサー1
これはあなたにどれだけ役立つでしょうか?
awk -vRS="]" '/rootVolume:false/ {for (i=1; i<=NF; i++) if ($i ~ /name|deviceName/) print $i}' file
name:/var/log/devops|40GB;/home/devops|150GB,
deviceName:/dev/sdb,
1行を分割し、すべての]
フィールドをスキャンしてターゲットフィールドを見つけて印刷します。次のように、結果をシェル変数として読み取ることができます。
read VARA VARB REST <<< $(awk -vRS="],*" -vORS=" " '/rootVolume:false/ {for (i=1; i<=NF; i++) if ($i ~ /name|deviceName/) print $i}' file)
echo $VARA
name:/var/log/devops|40GB;/home/devops|150GB,
echo $VARB
deviceName:/dev/sdb,