我通常会用printf足够的空白填充每个单元格,以在其各自的列上保持标题位置。
最终,我可以遍历输出的每一行并进行足够的cut调用,以便我对printf每一行进行调用,但这似乎是一种非常低效的处理方式。
有没有一种方法可以将上述输出转换为漂亮的打印格式,而无需多行或多次调用相同的实用程序?
我们有以下输出
猫gh.log
machine status
=============================================================
connection_ght 400
pach_po 72
timeout 311
ping_agent 119675
rt_machine 231
ginco_snmp 14
.
.
.
.
Run Code Online (Sandbox Code Playgroud)
如何通过使用打印这样的输出 printf
machine status
=============================================================
connection_ght..... 400
pach_po............ 72
timeout............ 311
ping_agent......... 119675
rt_machine......... 231
ginco_snmp ........ 14
Run Code Online (Sandbox Code Playgroud) 运行 bash 脚本后,我的(gnome-)终端最终打印了最后一行结束的每一新行(但在下一行)。我认为它printf破坏了东西,因为如果我替换printf为 ,它就可以工作echo。您知道这可能是什么,以及如何在不关闭终端会话的情况下修复它吗?
出于安全原因,我无法提供脚本。当我有时间时,我会看看是否可以创建一个最小的损坏示例来展示。
如果我用 C 写一行非常简单的代码:
printf("Ascii char for %d is %c\n",65,65);
Run Code Online (Sandbox Code Playgroud)
它只是打印A,因为 ascii 值 65 对应于字符A。但是如果我在shell中使用相同的代码并编写命令
printf "Ascii char for %d is %c\n" 65 65
Run Code Online (Sandbox Code Playgroud)
它将输出显示为Ascii char for 65 is 6. 我期待与 C 语言相同的输出,并且在逻辑上它也应该打印与给定的 ascii 代码对应的字符。
为什么在这些情况下它表现出不同的行为?
我有一组这样的数据:
user1 1234 01/01/2020
user2 2345 02/02/2020
Run Code Online (Sandbox Code Playgroud)
我需要将第三列(日期)转换为 EPOCH,同时保留用户名和 ID 号。
user1 1234 1577862000
user2 2345 1580626800
Run Code Online (Sandbox Code Playgroud)
我已经能够进行转换和打印,但新日期被附加到新行中。
$awk '{print($1,$2)}; system("date -d "$3" +%s")' data
user1 1234
1577862000
user2 2345
1580626800
Run Code Online (Sandbox Code Playgroud)
如何让新的 EPOCH 日期与第 1 列和第 2 列在同一行?
我有一个像这样的粘贴命令
paste -d , file1.csv file2.csv file3.csv
file2.csv 包含这样的数字
0.2
0.3339
0.111111
Run Code Online (Sandbox Code Playgroud)
我希望 file2.csv 中的值具有 3 位小数,如下所示:
0.200
0.334
0.111
Run Code Online (Sandbox Code Playgroud)
对于一个值,这是有效的:
printf "%.3f" "0.3339"->0.334
但对于 file2.csv 中的多个值,这不起作用:
paste -d , file1.csv <(printf %s "%.3f" "$(< file2.csv)") file3.csv
也许有一个好的解决方案?
printf %s%s one two打印onetwo但我想要oneonetwotwo
我怎样才能做到这一点?
printf一段时间以来,我一直在尝试定义千位分隔符,但我发现 zsh 存在一些问题。
在 bash 中,我可以使用类似的东西:
$ printf "%'d\n" 1234567890
1,234,567,890
Run Code Online (Sandbox Code Playgroud)
但在 zsh 中它不起作用:
$ printf "%'d\n" 1234567890
printf: %': invalid directive
Run Code Online (Sandbox Code Playgroud)
我刚刚发现 coreutilsprintf会做得很好:
$/usr/bin/printf "%'d\n" 1234567890
1,234,567,890
Run Code Online (Sandbox Code Playgroud)
如何在 zsh 中使用千位分隔符?
$ zsh --version
zsh 5.0.2 (x86_64-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud) 我有以下测试脚本。
#!/bin/bash
function foo {
printf "Test line break: $1\nafter line break\n\n"
}
for VARIABLE in {1..30}
do
foo $VARIABLE &
done
wait
Run Code Online (Sandbox Code Playgroud)
现在我执行了几次脚本,有时输出看起来像这样:
Test line break: 15
Test line break: 14
after line break: 14
after line break: 15
Test line break: 16
after line break: 16
Run Code Online (Sandbox Code Playgroud)
而不是预期的:
Test line break: 15
after line break: 15
Test line break: 14
after line break: 14
Test line break: 16
after line break: 16
Run Code Online (Sandbox Code Playgroud)
如何防止 printf“中断”另一个 printf,但仍在后台运行它?
对我来说,问题似乎是 printf 中的“\n”。
壳牌:猛击。
目标:获取自某个固定时间点以来的时间 t(以毫秒为单位),适用于使用 printf 为内容添加时间戳。
条件:解决方案必须通过多合一文本行测试。
附加:解决方案应该是原子的(是的,对!..),轻量级,将量化和舍入问题保持在最低限度,等等..
t=$[$(date +%s%N)/1000000]<--- 我的解决方案,在这种情况下,固定点是 1970 年 1 月 1 日。但由于两次约会电话,从根本上来说很糟糕。
printf "t=%d\n" $[$(date +%s%N)/1000000] <--- 在这里,使用 printf。
t=$(date +%s)$[10#$(date +%N)/1000000]<--- 可怕的例子。甚至似乎需要取消填充,然后重新填充前导零。
printf "t=%d%03d\n" $(date +%s) $[10#$(date +%N)/1000000] <--- 在这里,使用 printf。
有什么更好的(明智的)建议吗?
编辑(附加):
t=$(date +%s%N)然后printf "%s\n" ${t::13}<--- 我猜,但不是一行。
printf ×10
bash ×4
awk ×2
newlines ×2
zsh ×2
ascii ×1
c ×1
command-line ×1
csv ×1
ls ×1
numeric-data ×1
paste ×1
printing ×1
shell ×1
shell-script ×1
terminal ×1
timestamps ×1