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