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}'}
您需要围绕
"$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。
(我从上面编辑了你的记忆值。)我没有反对,因为很难弄清楚如何表达对此类事物的搜索,但我强烈建议阅读文档并记住空格是必须进行相应处理的元字符。