我在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 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
使用tr
after从输出中grep
删除。[], ....etc