Shell-Script

如何從具有多個分隔符的同一行列印匹配值?

  • October 1, 2018

我在 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,

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