Shell 脚本拆分 du -sh * 结果
Shell script split du -sh * result
我是 shell 脚本的初学者。
今天我想创建一个 shell 脚本来检查磁盘使用情况,
我使用 du -sh *|grep [MG]|sort -r
记录这样的结果:
space=$(du -sh *|grep [MG]|sort -r)
for file in $space
do
echo $file
done
====== result:
10G
fileA
50M
fileB
但我想得到像这样的对象的结果:
{
"fileA": "10G",
"fileB": "50M"
}
如何使用 awk
或其他命令来重组结果?
您可以使用这个 awk
:
du -sh * |
awk -F '\t' 'BEGIN{ print "{" }
~ /[GM]$/ {printf "%s\"%s\": \"%s\"", (++n>1?",\n":""), , }
END{ print "\n}" }'
假设您的文件名中没有制表符。
从 du
到 json
给定 du
的输出格式 ...
14M someFile
6.6M anotherFile
576K yetAnotherFile
0 MyEmptyFile
...可以用sed
转换成json:
这里我们假设您不必在文件名中引用特殊符号,例如 "
。您可以通过插入像 s/"/\"/g
这样的 sed 命令来引用它们。如果您还必须处理文件名中的换行符,请查看 du -0
和 sed -z
。
... | sed -E '1i {
s/(.*)\t(.*)/"": "",/
$s/,$//
$a }'
正在过滤 du
的输出
请注意,du -sh *| grep [MG] | sort -r
可能无法达到您的预期。使用上面的示例文件你会得到
6.6M anotherFile
14M someFile
0 MyEmptyFile
- 我假设您只想显示大小 > 1MB 和 < 1TB 的文件。然而,
grep [MG]
还有 selects 个文件,它们的名称中包含 M
或 G
。如果当前目录包含一个名为 M
或 G
的文件,您甚至可能只得到 grep M
或 grep G
,因为未加引号的 [MG]
是一个 glob(像 *
) 可以扩展 bash.
使用 grep '^[0-9.]*[MG]'
安全地 select 大小在 MB
和 GB
. 中指定的文件
- 对于
sort -r
,您可能希望按文件大小排序。但这不起作用,因为 sort -r
按字母顺序排序,而不是按数字排序(即 9
> 11
)。但即使使用数字排序,您最终也会得到错误的顺序,因为后缀 M
和 G
未被解释(即 2M
> 1G
)。
使用 sort -hr
按文件大小排序。
把所有东西放在一起
du -sh * | grep '^[0-9.]*[MG]' | sort -hr | sed -E '1i {
s/(.*)\t(.*)/"": "",/
$s/,$//
$a }'
这是 GNU awk
du -sh * |
grep -E '^[0-9.]+[MG]' |
# sort -h for human numeric sort that understands M and G suffixes
sort -hr |
awk -F'\t' '
BEGIN { print "{" }
# print trailing comma for previous line
NR > 1 { print "," }
{ printf "\"" "\": \"" "\"" }
END { print "\n}" }
'
我是 shell 脚本的初学者。
今天我想创建一个 shell 脚本来检查磁盘使用情况,
我使用 du -sh *|grep [MG]|sort -r
记录这样的结果:
space=$(du -sh *|grep [MG]|sort -r)
for file in $space
do
echo $file
done
====== result:
10G
fileA
50M
fileB
但我想得到像这样的对象的结果:
{
"fileA": "10G",
"fileB": "50M"
}
如何使用 awk
或其他命令来重组结果?
您可以使用这个 awk
:
du -sh * |
awk -F '\t' 'BEGIN{ print "{" }
~ /[GM]$/ {printf "%s\"%s\": \"%s\"", (++n>1?",\n":""), , }
END{ print "\n}" }'
假设您的文件名中没有制表符。
从 du
到 json
给定 du
的输出格式 ...
14M someFile
6.6M anotherFile
576K yetAnotherFile
0 MyEmptyFile
...可以用sed
转换成json:
这里我们假设您不必在文件名中引用特殊符号,例如 "
。您可以通过插入像 s/"/\"/g
这样的 sed 命令来引用它们。如果您还必须处理文件名中的换行符,请查看 du -0
和 sed -z
。
... | sed -E '1i {
s/(.*)\t(.*)/"": "",/
$s/,$//
$a }'
正在过滤 du
的输出
请注意,du -sh *| grep [MG] | sort -r
可能无法达到您的预期。使用上面的示例文件你会得到
6.6M anotherFile
14M someFile
0 MyEmptyFile
- 我假设您只想显示大小 > 1MB 和 < 1TB 的文件。然而,
grep [MG]
还有 selects 个文件,它们的名称中包含M
或G
。如果当前目录包含一个名为M
或G
的文件,您甚至可能只得到grep M
或grep G
,因为未加引号的[MG]
是一个 glob(像*
) 可以扩展 bash.
使用grep '^[0-9.]*[MG]'
安全地 select 大小在MB
和GB
. 中指定的文件
- 对于
sort -r
,您可能希望按文件大小排序。但这不起作用,因为sort -r
按字母顺序排序,而不是按数字排序(即9
>11
)。但即使使用数字排序,您最终也会得到错误的顺序,因为后缀M
和G
未被解释(即2M
>1G
)。
使用sort -hr
按文件大小排序。
把所有东西放在一起
du -sh * | grep '^[0-9.]*[MG]' | sort -hr | sed -E '1i {
s/(.*)\t(.*)/"": "",/
$s/,$//
$a }'
这是 GNU awk
du -sh * |
grep -E '^[0-9.]+[MG]' |
# sort -h for human numeric sort that understands M and G suffixes
sort -hr |
awk -F'\t' '
BEGIN { print "{" }
# print trailing comma for previous line
NR > 1 { print "," }
{ printf "\"" "\": \"" "\"" }
END { print "\n}" }
'