같은 줄에서 여러 구분 기호를 사용하여 일치하는 값을 인쇄하는 방법은 무엇입니까?

같은 줄에서 여러 구분 기호를 사용하여 일치하는 값을 인쇄하는 방법은 무엇입니까?

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하면 돼

루트볼륨=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

이것이 당신에게 얼마나 도움이 될까요?

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,

한 줄을 분할한 ]다음 모든 필드를 스캔하여 대상 필드를 찾아 인쇄합니다. 다음과 같이 결과를 쉘 변수로 읽을 수 있습니다.

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 일치하는 줄 중 일치하는(비어 있지 않은) 부분만 인쇄합니다. 각 부분은 별도의 출력 줄에 표시됩니다.

tr출력에서 제거하려면 after를 사용하십시오 grep.[], ....etc

관련 정보