我正在更改监控日志文件的工作脚本,以挑选出某些项目并为它们着色。最终输出是多列中的 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)
如果这有所作为,这里是真正的脚本堆栈(一团糟):
grep/ cut/etc。cut/etc. 的shell 脚本,然后通过管道传输到 .pl也许watch不喜欢颜色呢?
我perl不太清楚,所以我想显示我在打印线周围看到的内容不会有什么坏处:
my $format = ("%-8s") x scalar(@{$a[0]});
printf("$format\n", @$_)
Run Code Online (Sandbox Code Playgroud) 我正在 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)
那个变量引用在做什么?这是什么意思?
我有一个跟踪时间的脚本。
当我在控制台中打印输出时,我得到以下信息:
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。但我没有变得更聪明......
如何使用 修复输出宽度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) 假设我有这个数字: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包含多字节字符的字符串的输出时,很明显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 这样的固定宽度字符编码?
如果我使用以下命令:
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) 有没有一种简单的方法可以用 printf, awk, sed 分隔每千个非常大的数字?
所以 10000000000000 变成 10 000 000 000 000
谢谢
该/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)
问题:
略读man bash dash一下似乎并没有说明builtin 的 这种优势printf。凡被它记录?
难道内置 printfS(例如 bash)在字符的参数列表最大长度,如果是这样,那是什么长度?
jq具有将数字转换为字符串或连接字符串的内置功能。
如何在 jq 中格式化类似于printf填充(%4s)的字符串。
例如,如何强制 number 占用 10 个左对齐字符空间?
echo '{"title" : "A sample name", "number" : 1214}' | jq '(.title) + " " + (.number | tostring)'