标签: printf

防止手表损坏颜色

我正在更改监控日志文件的工作脚本,以挑选出某些项目并为它们着色。最终输出是多列中的 6 位数字列表。我已经能够~在数字的开头添加一个,并且它不会破坏最终输出中的任何内容,但是它相当丑陋且难以阅读。但是,当我尝试为数字着色时,无论是在前面的 bash 脚本中还是在 perl 脚本中对数据进行最终处理时,彩色文本都会被破坏。

例如,我将放入的原始数字$num

123456
Run Code Online (Sandbox Code Playgroud)

我在 perl 中输入了这个(或者,在 bash 中输入了很多相同的东西):

"\e[1;34m" . $num . "\e[0m"
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

[1;34m123456[0m 
Run Code Online (Sandbox Code Playgroud)

我也试过这个,一个转义版本,但得到同样的东西:

"\x1B[1;34m" . $num . "\x1B[0m"
Run Code Online (Sandbox Code Playgroud)

如果这有所作为,这里是真正的脚本堆栈(一团糟):

  • Perl 调用内部 shell 脚本,然后通过管道传送到grep/ cut/etc。
  • 带有更多cut/etc. 的shell 脚本,然后通过管道传输到 .pl
  • shell 脚本监视输出

也许watch不喜欢颜色呢?

perl不太清楚,所以我想显示我在打印线周围看到的内容不会有什么坏处:

my $format = ("%-8s") x scalar(@{$a[0]});

printf("$format\n", @$_)
Run Code Online (Sandbox Code Playgroud)

colors printf

6
推荐指数
3
解决办法
3120
查看次数

可变格式的 Printf 格式 - 这个 var 引用了什么?

我正在 bash 中尝试 printf 格式,我遇到了这段代码:

#/bin/bash
divider===============================
divider=$divider$divider

header="\n %-15s %8s %10s %11s\n"
format=" %-15s %08d %10s %11.2f\n"
width=55

printf "$header" "ITEM NAME" "ITEM ID" "COLOR" "PRICE"

printf "%$width.${width}s\n" "$divider"

printf "$format" \
Triangle 13  red 20 \
Oval 204449 "dark blue" 65.656 \
Square 3145 orange .7
Run Code Online (Sandbox Code Playgroud)

我感兴趣的那一行是这样的:

printf "%$width.${width}s\n" "$divider"
Run Code Online (Sandbox Code Playgroud)

那个变量引用在做什么?这是什么意思?

shell bash printf

6
推荐指数
1
解决办法
2万
查看次数

终端与 .txt 文档中的不同格式

我有一个跟踪时间的脚本。

当我在控制台中打印输出时,我得到以下信息:

0 Days, 00:00:33
Run Code Online (Sandbox Code Playgroud)

当我将它保存到 txt 文件时,我得到了这个:

^[[2K
  0 Days, 00:00:33
Run Code Online (Sandbox Code Playgroud)

代码:

now=$(date +%s)
diff=$(($now - $begin))
mins=$(($diff / 60))
secs=$(($diff % 60))
hours=$(($diff / 3600))
days=$(($diff / 86400))

printf "\33[2K\r%3d Days, %02d:%02d:%02d" $days $hours $mins $secs
printf "\33[2K\r%3d Days, %02d:%02d:%02d" $days $hours $mins $secs >> test.txt
Run Code Online (Sandbox Code Playgroud)

哪里^[[2K来的?我猜它与 printf 中的格式有关。

我在这里阅读了一些关于 printf 的内容:http : //wiki.bash-hackers.org/commands/builtin/printf。但我没有变得更聪明......

shell-script date printf

6
推荐指数
2
解决办法
689
查看次数

格式化的 shell 脚本输出

如何使用 修复输出宽度printf

这是一个示例脚本:

#!/bin/bash
OK=$(printf '\t%+50s\n' OK)
FAIL=$(printf '\t%+50s\n' FAIL)
for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do
        echo "$i $OK"
done
Run Code Online (Sandbox Code Playgroud)

输出:

a                                                       OK
aa                                                      OK
aaa                                                     OK
aaaa                                                    OK
aaaaaa                                                  OK
aaaaaaaaaaaaaaaaa                                                  OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                                               OK
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西:

a                                                       OK
aa                                                      OK
aaa                                                     OK
aaaa                                                    OK
aaaaaa                                                  OK
aaaaaaaaaaaaaaaaa                                       OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                              OK
Run Code Online (Sandbox Code Playgroud)

shell-script printf text-formatting

6
推荐指数
3
解决办法
2万
查看次数

printf 是否有数字的“工程”符号格式?

假设我有这个数字:105000000,在这种形式中我不容易看出它有多大,所以printf在提示下使用我尝试使用“科学”符号:

% printf "%.3E" 105000000
1.050E+08
Run Code Online (Sandbox Code Playgroud)

这更好,但我想使用“工程”符号,其中输出格式为 10 3百万、十亿、万亿等的幂。
例如,我想将其格式化为如下所示:

105000        => 105.0E+03      (105 thousand)
105000000     => 105.0E+06      (105 million)
105000000000  => 105.0E+09      (105 billion)
...
Run Code Online (Sandbox Code Playgroud)

可以printf这样做吗?

printf

6
推荐指数
1
解决办法
2874
查看次数

printf:多字节字符

当尝试格式化printf包含多字节字符的字符串的输出时,很明显printf不计算文字字符而是字节数,如果混合单字节和多字节字符,这会使格式化文本变得困难。例如:

$ cat script
#!/bin/bash
declare -a a b
a+=("0")
a+=("00")
a+=("000")
a+=("0000")
a+=("00000")
b+=("0")
b+=("??00")
b+=("??000")
b+=("??0000")
b+=("??00000")
printf "%-15s|\n" "${a[@]}" "${b[@]}"

$ ./script
0              |
00             |
000            |
0000           |
00000          |
0              |
??00       |
??000      |
??0000     |
??00000    |
Run Code Online (Sandbox Code Playgroud)

我发现了各种建议的解决方法(主要是使用另一种语言或实用程序来打印文本的包装器)。是否有任何本机 bash 解决方案?任何记录的printf 格式字符串似乎都没有帮助。locale在这种情况下,这些设置是否相关,例如,使用像 UTF-32 这样的固定宽度字符编码?

bash character-encoding printf

6
推荐指数
1
解决办法
2621
查看次数

用 printf 重复变量

如果我使用以下命令:

printf "%.0s?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?\n" {1..3}
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出:

?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?
?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?
?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?
Run Code Online (Sandbox Code Playgroud)

如何通过从变量中获取重复字符来获得相同的结果?

我试过这种方法:

var="?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?"
printf '%.0s%s\n' {1..3} "$var"
Run Code Online (Sandbox Code Playgroud)

但它不起作用,我最终得到了这个:

2
?   ?   ?   ?   ?   ?   ?   ?   ?   ?   ?
Run Code Online (Sandbox Code Playgroud)

bash shell-script printf variable

6
推荐指数
1
解决办法
1411
查看次数

printf,awk ...如何将带有空格的数字格式化为千位

有没有一种简单的方法可以用 printf, awk, sed 分隔每千个非常大的数字?

所以 10000000000000 变成 10 000 000 000 000

谢谢

shell sed awk bc printf

6
推荐指数
3
解决办法
2293
查看次数

Shell内置`printf`行限制?

/usr/bin/printfUTIL参数列表的长度被限制在外壳的最大命令行长度( getconf ARG_MAX,我的系统上会是2097152); 例子:

# try using a list that's way too long
/usr/bin/printf '%s\n' $(seq $(( $(getconf ARG_MAX) * 2 ))) | tail -1
Run Code Online (Sandbox Code Playgroud)

输出:

bash: /usr/bin/printf: Argument list too long
Run Code Online (Sandbox Code Playgroud)

今天我被告知shell内置 printf没有这个限制;测试:

printf '%s\n' $(seq $(( $(getconf ARG_MAX) * 2 ))) | tail -1
Run Code Online (Sandbox Code Playgroud)

输出:

4194304
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 略读man bash dash一下似乎并没有说明builtin 的 这种优势printf。凡它记录?

  2. 难道内置 printfS(例如 bash)在字符的参数列表最大长度,如果是这样,那是什么长度?

shell bash dash shell-builtin printf

6
推荐指数
2
解决办法
1026
查看次数

如何使用 jq 进行格式化打印?

jq具有将数字转换为字符串或连接字符串的内置功能。
如何在 jq 中格式化类似于printf填充(%4s)的字符串。

例如,如何强制 number 占用 10 个左对齐字符空间?
echo '{"title" : "A sample name", "number" : 1214}' | jq '(.title) + " " + (.number | tostring)'

command-line bash printf text-formatting jq

6
推荐指数
3
解决办法
550
查看次数