同じ行に複数の区切り文字を使用して一致する値を印刷するには?

同じ行に複数の区切り文字を使用して一致する値を印刷するには?

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,

おすすめ記事