具有多个变量的命令

具有多个变量的命令

我试图让命令返回占用 1+ GiB 的文件夹的磁盘使用情况,但不知何故,命令中的第二个变量仅打印出第一个变量的值。此外,总计值不会打印在列中,而是作为通用文本打印,并使用空格作为分隔符。我在这里做错了什么?

OUTPUT="$(sudo ls -lah -R |awk '/^total/ {print $2}' |sort -h)"; GIGS="$(echo $OUTPUT | grep G | sed 's/G//')"; echo $GIGS

答案1

命令替换变量 OUTPUT 中的换行符会被保留,直到它们在您echo进行 GIGS 命令替换时被分词为止——此时您的输出将变成单个空格分隔的行。引用变量以保留换行符。 GIGS 变量是几乎OUTPUT 变量的副本 - 您应该注意到其中的第一个“G”已被删除。您可能会尝试删除所有 G,在这种情况下您需要使用sed 's/G//g'.

最终结果:

OUTPUT="$(sudo ls -lah -R |awk '/^total/ {print $2}' |sort -h)"; GIGS="$(echo "$OUTPUT" | grep G | sed 's/G//g')"; echo $GIGS

或者,分成多行:

OUTPUT="$(sudo ls -lah -R |awk '/^total/ {print $2}' |sort -h)";
GIGS="$(echo "$OUTPUT" | grep G | sed 's/G//g')"; 
echo $GIGS

作为可能的简化,考虑在 awk 中做更多工作:

sudo ls -alhR | awk '/^total/ && /G$/ { print substr($2, 1, length($2)-1) }' | sort -n

这扩展了 awk 匹配模式,要求行以 'G' 结尾(照顾你的 grep),然后在打印之前从字符串中删除尾随 (G) 字符;然后sort -n最后就很简单了。

相关内容