如何确定文件系统在AIX中是否具有一定的空间量

时间:2015-06-01 14:07:20

标签: shell unix awk aix

在我脑海中试图解析这个问题时遇到了一点麻烦。我在korn shell中创建一个脚本来查找文件系统是否至少有5GB。如果它没有5GB,我希望脚本出错。

我找到可用空间的代码是

config.json

我在CultureInfo ci = new CultureInfo("es-ES", false); string date = DateTime.Now.ToString("MMMM dd REPLACE yyyy", ci).Replace("REPLACE", "de"); 语句中使用它,如

string.Replace

我得到的错误是

df -g /u00 | sed -n '2p' | awk '{print $3}'

显然,我并不喜欢把if置于其中的地方,我认为这是因为我试图将它与{{{{{{{{{{{{{{{{ 1}}。问题是,我不确定如何将它写到if df -g /u00 | sed -n '2p' | awk '{print $3}' -lt "5.00"; then #There's less than 5gb echo "There's less than 5GB, please clear up space to continue" exit 1 else echo "Enough space, continuing" fi 语句旁边不会呛到的地方。是否有更好的方法进行比较,或者我是否错误地将其传递给awk: 0602-533 Cannot find or open file -lt. The source line number is 1. Enough space, continuing

我也尝试将其作为变量传递,如

-lt

它似乎也不喜欢

3 个答案:

答案 0 :(得分:1)

使用和How to select a particular column in linux df command我会说:

df --output=avail /u00

因为输出类似于

    Avail
299344672

,你总是想要最后一行。为此,我们可以使用awk中使用END的技巧。该块在读取文件后执行,但它存储了读取的最后一行,因此它是这种情况的完美解决方案。

在那里,我们执行field > 5GB的逻辑(注意我通过说5 * 1024 ^ 3获得值)。如果发生这种情况,我们会打印1;否则,没有打印出来:

df ... | awk 'END {if ($1 > 1024*1024*1024*5) print 1}')

总之,可以使用if [ -n "$value" ]条件检查,检查$value是否为空:

if [ -n "$(df --output=avail . | awk 'END {if ($1 > 1024*1024*1024*5) print 1}')" ]; then
    echo "bigger"
fi

来自man test

   -n STRING
          the length of STRING is nonzero

关于您的解决方案: export AWK = df -g / u00 | sed -n'2p'| awk'{print $ 3}' 如果[$ AWK -lt“5.00”];

这不起作用,因为语法为var=$(command)。此外,if条件的语法是if [ ... ];也就是说,您需要[周围的空格。

所有在一起:

export AWK=$(df -g /u00 | sed -n '2p' | awk '{print $3}')
if [ "$AWK" -lt "5.00"];

答案 1 :(得分:0)

无论出于何种原因,我的AIX 6和AIX 7盒子上的df版本非常有限,并且无法识别很多预期的字段,如--output和-m。另外,-g的输出不是非常友好的。

我最终使用它来确定使用的空间百分比。如果我想计算可用空间,则存在可提供该信息的其他列,但可用百分比符合我的需求。

df -v /backup | grep "/"|awk '{print $6}'

df -v包含以下列,我认为可以简化上述答案中的awk命令,如下所示:

df -v /backup | grep "/"|awk '{if ($5 > 1024*1024*1024*5) print $5}'

这可能只有在我拥有df的版本时才有效。我试着运行df -v来弄清楚它是什么,但后来我意识到这只是给了我已经看过的东西。 :-)

答案 2 :(得分:0)

-lt没有做到你预期的原因是它只对[命令有意义。它不是一个可以在shell命令中的任何位置使用的关键字。

如果您想与-lt进行比较,则需要以[ "THING1" -lt "THING2" ]格式撰写,其中THING1THING2是两个数字比较。 (双引号确保THING1THING2不会被分解为单独的单词,即使您犯了一些错误并且意外地包含了非数字字符。)如果您想使用输出awk在这个比较中,使用命令susbtitution。

if [ "$(df -g /u00 | sed -n '2p' | awk '{print $3}')" -lt 5 ]; then …

请注意,您只能使用整数,而不能使用浮点数。 (如果你使用ksh,那可能不是真的,我不确定AIX的ksh版本是什么。)

但awk可以轻松进行数值比较,因此让它进行比较会更简单。使用exit函数从awk返回所选状态;注意awk使用0表示false,非零表示true,但shell使用0表示成功,非零表示失败。 Awk也可以进行整个数据提取,此外不需要使用sed。此外,要从df获取可以(通常)可靠且可移植的方式解析的输出,请使用-P选项。

if df -P -k /u00 | awk 'NR==2 {exit !($4 < 5*1024*1024)}'; then
  echo "Less than 5GB available"
fi