如何捕获 df -h --total - Bash 的输出

How to capture output of df -h --total - Bash

我正在编写一个脚本,用于收集有关跨服务器的不同分区上可用和已用 space 的信息。我需要能够将输出捕获为变量。

例如,如果输出如下:

Filesystem                          Size  Used Avail Use% Mounted on
devtmpfs                            2.9G     0  2.9G   0% /dev
tmpfs                               2.9G  4.0K  2.9G   1% /dev/shm
tmpfs                               2.9G  488K  2.9G   1% /run
tmpfs                               2.9G     0  2.9G   0% /sys/fs/cgroup
/dev/mapper/vg_os-lv_root           3.9G  1.6G  2.1G  44% /

如何捕获第二行 Used、Avail 和 Mounted on 作为变量?

您可以使用 sed 或者 headtail 来获取第二行,或者如果您知道挂载点,则 grep.

要解析该行,您可以使用 awk 并拆分一个或多个空格并打印出您想要的元素:

df -h --total | sed -n '2 p' | awk -F "[[:space:]]+" '{ print  " "  " "  }'

要将其分配给变量,请执行以下操作:

stats=$(df -h --total | sed -n '2 p' | awk -F "[[:space:]]+" '{ print  " "  " "  }')

[编辑]:按照评论中的建议:

df -h --total | awk -F "[[:space:]]+" 'NR==2{print  " "  " "  }'

我对类似的事情使用一般方法:为了捕获一行,我在关键字的情况下使用 grep,或者在情况下使用 headtail 的组合的行号。然后,我使用 awk 获取特定列。

在这种情况下,您会得到如下内容:

var_used=$(df -hk | grep "/dev/shm" | awk '{print }')
var_avail=$(df -hk | grep "/dev/shm" | awk '{print }')
var_mounted=$(df -hk | grep "/dev/shm" | awk '{print }')

如果您对“/dev”感兴趣,您需要在 /dev$ 上进行 grep(美元符号代表“行尾”)。

供您参考:我已经提到了 headtail 的用法,但我没有具体说明它是如何工作的,原因很简单:您似乎对其中一个感兴趣特定行(如“/dev”),当前位于输出的第一行。如果出于任何原因,此行号发生更改,您可能需要重新编写脚本,但使用“grep”方法不会发生此问题。

首先,我建议使用 df 的特殊选项来只获取需要的字段:

$ df -h --output=avail,used,target
Avail  Used Mounted on
 7.3G     0 /dev
 1.5G  3.2M /run
 7.0G   21G /
 7.2G  188M /dev/shm
 5.0M  4.0K /run/lock
 7.4G     0 /sys/fs/cgroup
  61G  189G /home
 1.5G   16K /run/user/125
 1.5G   60K /run/user/1000

然后使用readarray(mapfile)将数据存储到数组中:

readarray -t -s1 arr <<< $(df -h --output=avail,used,target)

读取数组选项:

-s count  Discard the first COUNT lines read
-t        Remove a trailing DELIM from each line read (default newline)

可以这样访问:

$ echo ${arr[0]}
7.3G 0 /dev

分成变量:

read avail used mount <<< ${arr[0]}
$ echo $avail $used $mount
7.3G 0 /dev