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

Nah*_*paz 4 scripting bash awk

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

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

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

jas*_*yan 9

Awk 在“模式 {action}”模型上工作,因此您可以将这两个过程组合成一个正确的:

 df -m | awk 'NR==2 {print $4}'
Run Code Online (Sandbox Code Playgroud)

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

df -m | awk '$NF == "/" {print $4}'
Run Code Online (Sandbox Code Playgroud)

这可确保您的模式与df打印的任何地方相匹配/

  • 我现在明白了,`NF` 是字段的数量,`$NF` 是第 NF 个字段的值。 (2认同)

fed*_*qui 6

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

df -m /
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用该--output选项来定义要显示的列。在这种情况下,“可用”,即

df -m --output=avail /
Run Code Online (Sandbox Code Playgroud)

来自man df

--output[=FIELD_LIST]

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

...

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

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