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 -0sed -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 个文件,它们的名称中包含 MG。如果当前目录包含一个名为 MG 的文件,您甚至可能只得到 grep Mgrep G,因为未加引号的 [MG] 是一个 glob(像 *) 可以扩展 bash.
    使用 grep '^[0-9.]*[MG]' 安全地 select 大小在 MBGB.
  • 中指定的文件
  • 对于 sort -r,您可能希望按文件大小排序。但这不起作用,因为 sort -r 按字母顺序排序,而不是按数字排序(即 9 > 11)。但即使使用数字排序,您最终也会得到错误的顺序,因为后缀 MG 未被解释(即 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}" }
'