como imprimir o valor correspondente da mesma linha, que possui múltiplos Delimitadores?

0

Eu tenho um arquivo no Linux /tmp/volume.log e o conteúdo é:

[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]],

Será em linha única. Este arquivo é gerado por algum outro script.

Meu objetivo é encontrar o disco de volume não-raiz e analisá-lo para comandos de LVM como variável para estender ou criar novos volumes, no momento da criação do sistema operacional.

No exemplo acima.

Existem dois discos, 1 - sda que é o disco raiz, (se rootVolume for verdadeiro, é disco raiz) 2 - sdb que é disco não raiz (se rootVolume for falso, é disco não root)

Eu tenho apenas grep

rootVolume=false

e grep então

deviceName:/dev/sdb

seguido por:

name:/var/log/devops|40GB;/home/devops|150GB

Uma vez que eu analisei todas as variáveis acima, eu posso chamar essas variáveis nos comandos como

#!/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

Agora estou impressionado com Extracting the Values do arquivo Text, porque eles estão em uma única linha e vários Delimiters estão presentes.

    
por user3179298 01.10.2018 / 13:15

2 respostas

0

Até onde isso te leva:

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,

Divide a linha única em ] , em seguida, faz a varredura em todos os campos para encontrar os itens-alvo e os imprime. Você pode ler o resultado em variáveis de shell, então:

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,
    
por 01.10.2018 / 14:09
0

Você pode usar o comando cut algo como:

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

Ou com 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, - apenas correspondência               Imprima apenas as partes correspondentes (não vazias) de uma linha correspondente, com cada uma dessas partes em uma linha de saída separada.

Use tr após grep para remover [], ....etc da sua saída.

    
por 01.10.2018 / 13:29