Fed*_*ra 2 linux bash shell scripting awk
我需要制作一个 bash 脚本来比较 redhat 服务器上 vg 的空间。到目前为止我所拥有的是:
#!/bin/bash
##VARS
CMD=$(vgs | grep vgSoft | awk -F" " '{print $7}' | awk -F"<" '{print $2}'| awk -F"g" '{print $1}')
SPACE="10.00"
if [[ "$CMD" < "$SPACE" ]]; then
echo "It's not enough space, you must extend the VG"
echo "Space is equal to: $CMD GB"
elif [[ "$CMD" == "$SPACE" ]]; then
echo "It's enough space but consider extend the VG"
elif [[ "$CMD" > "$SPACE" ]]; then
echo "It's enough space"
echo "Space is equal to: $CMD GB"
fi
Run Code Online (Sandbox Code Playgroud)
我用这个命令做什么是获取卷组的输出并解析数据以获得所需的值vgs | grep vgSoft | awk -F" " '{print $7}' | awk -F"<" '{print $2}'| awk -F"g" '{print $1}'并将其保存到 CMD 变量。其中命令的输出vgs是:
[root@server~]# vgs
VG #PV #LV #SN Attr VSize VFree
vgSoft 2 13 0 wz--n- 71.99g <26.14g
vgSys 1 12 0 wz--n- <63.51g <36.52g
Run Code Online (Sandbox Code Playgroud)
因此,在本例中,我的 CMD 变量的结果是26.14 我正在与值 10.00(分配给 SPACE 变量)进行比较。
但我在比较字符串时遇到问题,因为vgs命令的输出例如是 9.46 ,脚本告诉我“空间足够” ,而输出应该是“空间不足,必须扩展 VG”。据我记得我无法使用运算符“eq”“gt”“ne”,因为我正在与字符串而不是整数值进行比较。
使用您显示的示例,请尝试以下awk代码。我们可以在单个awk.
我们有一个awk名为的变量space,我已10按照 OP 显示的尝试定义了值,可以根据需要更改它。
vgs | awk -v space="10" '
FNR==1 || !/vgSoft/{ next }
{
value=substr($7,2,length($7)-1)+0
}
value<space {
print "It\047s not enough space, you must extend the VG"
next
}
value==space{
print "It\047s enough space but consider extend the VG"
next
}
value>space {
print "It\047s enough space"
}
'
Run Code Online (Sandbox Code Playgroud)
或者,如果您的行中有第七个字段,该字段可能或无法<在其值中开始,因此要处理此类情况,请尝试以下awk代码。
vgs | awk -v space="10" '
FNR==1 || !/vgSoft/{ next }
{
sub(/^</,"",$7)
value=$7+0
}
value<space {
print "It\047s not enough space, you must extend the VG"
next
}
value==space{
print "It\047s enough space but consider extend the VG"
next
}
value>space {
print "It\047s enough space"
}
'
Run Code Online (Sandbox Code Playgroud)
说明:首先运行vgs命令并将其标准输出作为标准输入发送到awk程序。在按照所示尝试awk创建值为 10 的变量space然后在主程序中,检查条件是否其行第一行或行不包含vgSoft字符串,然后简单地跳转到下一行。如果一行包含vgSoft字符串,则创建一个名为的变量,value该变量将从当前行的第 7 个字段中获取值(不<包含g第 7 个字段),然后使用 3 个条件进行检查(值是否等于或小于或大于空格)然后相应地打印报表。
公平警告我没有 vgs 命令,所以我测试了这段代码,将vgs命令的示例输出放入 Input_file 中并针对awk程序运行它,它对我来说效果很好。