Shell-Script
如何從具有多個分隔符的同一行列印匹配值?
我在 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 命令作為變數以擴展或創建新卷。
在上面的例子中。
有兩個磁碟,1 - sda 是根磁碟,(如果 rootVolume 為 true,則為根磁碟) 2 - sdb,非根磁碟(如果 rootVolume 為 false,則為非根磁碟)
我只需要 grep
根卷=假
然後 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
現在我很震驚,從文本文件中提取值,因為它們在單行中並且存在多個分隔符。
這會讓你走多遠:
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,
它在 處拆分單行
]
,然後掃描所有欄位以找到目標欄位,並列印它們。您可以像這樣將結果讀入 shell 變數,然後: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,