如何从同一行打印具有多个分隔符的匹配值?

如何从同一行打印具有多个分隔符的匹配值?

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

它将是单行的。该文件是由其他一些脚本生成的。

我的目标是在操作系统构建时找到非根卷磁盘并将其解析为 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

现在,我对从文本文件中提取值感到震惊,因为它们在单行中并且存在多个分隔符。

答案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,

它分割 处的单行],然后扫描所有字段以找到目标字段,并打印它们。您可以将结果读入 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,

答案2

cut您可以使用类似以下的命令:

cat /tmp/volume.log | cut -d, -f14 | tr -d "]["
rootVolume=false

make it a variable:
rootvolume=$(cat /tmp/volume.log | cut -d, -f14 | tr -d "][")

cat /tmp/volume.log | cut -d, -f3
deviceName:/dev/sda

cat /tmp/volume.log | cut -d, -f9
name:/var/log/devops|40GB;/home/devops|150GB

或者与grep

cat /tmp/volume.log | grep -o "rootVolume:false]]," | tr "][,"

make it a variable:
rootvolume=$(cat /tmp/volume.log | grep -o "rootVolume:false]]," | tr "][,")

cat /tmp/volume.log | grep -o "deviceName:/dev/sda"

cat /tmp/volume.log | grep -o "name:/var/log/devops|40GB;/home/devops|150GB" | tr -d "\n"

-o, --only-matching 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。

使用trafter从输出中grep删除。[], ....etc

相关内容