AIX中如何判断一个文件系统是否有一定数量的space

How to determine if a file system has a certain amount of space in AIX

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

我找到可用 space 的代码是

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

我在像

这样的 if 语句中使用它
if df -g /u00 | sed -n '2p' | awk '{print }' -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 放在这里的位置,我认为这是我试图将它与 awk 结合的事实。问题是,我不确定如何将它写到不会在 awk 语句旁边阻塞的地方。有没有更好的方法来进行比较,还是我将它传递给 -lt 不正确?

我也尝试过将它作为变量传递,例如

export AWK=df -g /u00 | sed -n '2p' | awk '{print }'
if [$AWK -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

它似乎也不喜欢那样

使用和 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 ( > 1024*1024*1024*5) print 1}')

总而言之,这可以用 if [ -n "$value" ] 条件来检查,即检查 $value 是否为空:

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

来自 man test:

   -n STRING
          the length of STRING is nonzero

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

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

总计:

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

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

我最终使用它来确定使用的百分比 space。如果我想计算可用 space,存在其他列可以提供该信息,但可用百分比满足我的需要。

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

df -v 有以下列我认为可以像这样简化上面答案中的 awk 命令:

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

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

-lt 没有按照您的预期执行的原因是它只对 [ 命令有意义。它不是您可以在 shell 命令中的任何地方使用的关键字。

如果您想与 -lt 进行比较,您需要将其写成 [ "<em>THING1</em>" -lt "<em>THING2</em>" ] 其中 <em>THING1</em><em>THING2</em> 是要比较的两个数字。 (双引号确保 <em>THING1</em><em>THING2</em> 是' 分解成单独的词,即使您犯了一些错误并意外地包含了非数字字符。)如果您想在此比较中使用 awk 的输出,请使用命令 susbtitution。

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

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

但是awk可以很容易地进行数值比较,所以让它进行比较会更简单。使用 exit 函数来 return 从 awk 中选择的状态;注意 awk 使用 0 表示假,使用非零表示真,但是 shell 使用 0 表示成功,使用非零表示失败。 awk 也可以做整个数据提取,没有必要另外使用 sed。此外,要从 df 获取可以(大部分)可靠且可移植的方式解析的输出,请使用 -P 选项。

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