【问题标题】:AWK Print Second Column of Last LineAWK 打印最后一行的第二列
【发布时间】:2014-03-24 21:15:00
【问题描述】:

我正在尝试使用 AWK 发布此命令最后一行的第二行(总磁盘空间):

df --total

我使用的命令是:

df --total | awk 'FNR == NF {print $2}'

但它并不正确。 还有其他方法吗?

【问题讨论】:

标签: shell awk


【解决方案1】:

您正在使用 awk 变量 NF,即字段数。您可能指的是 NR,行数,但使用 END 更容易:

df --total | awk 'END {print $2}'

【讨论】:

  • 它在没有END 的情况下也可以工作。你能解释一下为什么需要END吗?
  • @185140777 因为否则它将打印所有行的第二个字段,而 END 它只打印最后一行的第二个字段。
【解决方案2】:

你可以先用tail再用awk

df --total | tail -1 | awk '{print $2}'

【讨论】:

  • @John,我不知道为什么额外的过程会降低它的用处。您的环境中的进程是否有某种资源配额? :-)
  • @paxdiablo:是的,我们绝对可以使用额外的流程。但这就像 Cat 的无用使用一样,我相信您会欣赏的:如果有人想在 awk 中做一些在 awk 中很容易做到的事情,那么就不需要产生另一个进程。就像有人问如何用 Python 做某事,而我们知道如何用 Perl 做一样;我们不建议为此生成子进程。但对每个人来说,也许这太老套了(就像 awk 本身一样!)。
【解决方案3】:

一种方法是使用tail/awk 组合,前者只获取最后一行,后者打印第二列:

df --total | tail -1l | awk '{print $2}'

纯-awk 的解决方案是简单地存储每一行​​的第二列并在最后打印出来:

df --total | awk '{store = $2} END {print store}'

或者,由于最后一列保留在最后一行的 END 块中,因此:

df --total | awk 'END {print $2}'

【讨论】:

  • 您不需要将$2 存储为变量,只需将其打印在末尾部分即可。
【解决方案4】:

awk 没有“这是最后一行”的概念。 sed 确实如此:

df --total | sed -n '$s/[^[:space:]]\+[[:space:]]\+\([[:digit:]]\+\).*/\1/p'

【讨论】:

    猜你喜欢
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多