如何捕获 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
或者 head
和 tail
来获取第二行,或者如果您知道挂载点,则 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
,或者在情况下使用 head
和 tail
的组合的行号。然后,我使用 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(美元符号代表“行尾”)。
供您参考:我已经提到了 head
和 tail
的用法,但我没有具体说明它是如何工作的,原因很简单:您似乎对其中一个感兴趣特定行(如“/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
我正在编写一个脚本,用于收集有关跨服务器的不同分区上可用和已用 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
或者 head
和 tail
来获取第二行,或者如果您知道挂载点,则 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
,或者在情况下使用 head
和 tail
的组合的行号。然后,我使用 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(美元符号代表“行尾”)。
供您参考:我已经提到了 head
和 tail
的用法,但我没有具体说明它是如何工作的,原因很简单:您似乎对其中一个感兴趣特定行(如“/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