awk - 将两个过滤器合并为一个

awk - 将两个过滤器合并为一个

我在 ubuntu 12.04 上的 bash 脚本中有这个变量,它设置为显示根分区上的可用 MB:

AV_MB=$(df -m |awk NR==2 |awk '{print $4}')

有没有一种优雅的方式将这两个 awk 表达式组合成一个?或者使用 sed 或 grep 或 cut 的更短方法?

答案1

Awk 适用于“pattern {action}”模型,因此您可以将这两个过程组合成一个正确的过程:

 df -m | awk 'NR==2 {print $4}'

然而,这是脆弱的,因为第二条记录可能会发生变化(在我的系统上,根记录是第三行),因此您可以匹配根文件系统记录的最后一个字段,如下所示:

df -m | awk '$NF == "/" {print $4}'

这可确保您的图案与df打印的任何位置相匹配/

答案2

由于您知道要查找的分区,因此只需在df命令中指定它即可:

df -m /

此外,您还可以使用该--output选项来定义要显示的列。在本例中,“可用”,即

df -m --output=avail /

man df

--输出[=FIELD_LIST]

使用由FIELD_LIST定义的输出格式,或者如果省略FIELD_LIST则打印所有字段。

...

FIELD_LIST 是要包含的以逗号分隔的列列表。有效的字段名称为:'source'、'fstype'、'itotal'、'iused'、'iavail'、'ipcent'、'size'、'used'、'avail'、'pcent' 和 'target'(请参阅信息页)。

但请注意,此--output选项可能仅在 GNU 中可用。此外,它还打印标题,因此您可能需要通过管道tail -1获取最后一行。

相关内容