bash中的命令包含printf但格式不交给变量

问题描述 投票:0回答:1

Bash版本:4.2.46 操作系统:linux 3.10.0-1160.108.1.e17

以下带有 printf 的命令应提供三列各 10 个字符。 仅在 bash 中运行它一切正常。

$ free -h | grep Mem | awk '{printf "%-10s %-10s %-10slala\n",$2,$3,$4}'
7.6G       2.0G       3.4G       lala

使用变量这样做,格式将会丢失。

$ LINE=$(free -h | grep Mem | awk '{printf "%-10s %-10s %-10s\n",$2,$3,$4}')
$ echo $LINE
7.6G 2.0G 3.4G

我哪里错了?

我很高兴获得专家的建议

谢谢你

F.

到目前为止我已经尝试过:

$ LINE=$(free -h | grep Mem | awk '{printf "%-10s %-10s %-10s\n",$2,$3,$4}')
$ LINE=`free -h | grep Mem | awk '{printf "%-10s %-10s %-10s\n",$2,$3,$4}'`
$ LINE=${free -h | grep Mem | awk '{printf "%-10s %-10s %-10s\n",$2,$3,$4}'}
format printf
1个回答
0
投票

您需要围绕

"$LINE"
进行报价。永远注意你的报价。
awk
这样做是正确的,但你却扔掉了空格。

(我在您的示例的

lala
中进行了编辑,顺便说一句。复制/粘贴命令及其输出匹配时请小心。)

此外,您的

printf
语句正在字段之间嵌入第 11 个文字空格(如果这很重要)。

你在和 $LINE

做什么
?如果你真的只是这样做
printf
那为什么还要麻烦呢?只需按照您展示的那样使用命令即可...除了,不要。尝试“永远不要”在单个命令中使用多个正则表达式引擎。当 grep 已经可以处理时,为什么要在
awk
上浪费系统资源只是为了将结果传递给
awk
$ free -h | awk '/^Mem:/{printf "%-10s%-10s%-10slala\n", $2, $3, $4}'
15G       1.3G      1.3G      lala

将结果传递回变量(顺便说一句,您通常不应该将其大写)只是为了漂亮地打印出来,这又是一种资源浪费,即使这是一项小任务。

如果您稍后需要这些值用于其他用途,请保存它们并单独格式化打印它们。

$ read -r _ totmem usemem fremem _ < <( free -h | grep ^Mem: ) $ printf "%-10s%-10s%-10slala\n" "$totmem" "$usemem" "$fremem" 7.6G 2.0G 3.4G lala

$ read -ra freemem < <( free -h | awk '/^Mem:/{print $2, $3, $3}' ) $ printf "%-10s%-10s%-10slala\n" "${freemem[@]}" 7.6G 2.0G 3.4G lala

甚至

freemem=( $(free -h) ); printf "%-10s" "${freemem[@]:7:3}"; echo lala 7.6G 2.0G 3.4G lala

可能使用 
printf

echo
的内置版本,因此只会为
free
生成一个子 shell。 (我从上面编辑了你的记忆值。)
我没有

反对

,因为很难弄清楚如何表达对此类事物的搜索,但我强烈建议阅读文档并记住空格是必须进行相应处理的元字符。

© www.soinside.com 2019 - 2024. All rights reserved.