如何使用 修复shell 中输出字符串的位置printf?
例如,如果我想TEXT-A在从左起第三个位置开始的位置打印文本,并TEXT-B在左起第十一个位置再打印一个文本,如下所示。

man printf,info printf而且printf --help对我来说都没什么用;我想要一个FORMAT选项的解释。例如,我可以使用:
printf '%s\n' foo bar
Run Code Online (Sandbox Code Playgroud)
并获得输出:
foo
bar
Run Code Online (Sandbox Code Playgroud)
从在线的一般阅读中,我推测这%s意味着类似于“分隔符”,因此它会printf打印提供给它的每个参数,并用换行符分隔。
我还在这里和那里看到了一些参考资料%d(我认为这与数字有关?)。有人可以提供这些格式选项的概述吗?
在unix shell中打印后如何修改一行。我们可以删除该行并使用\r如下所示再次写入,但是如何覆盖现有行而不完全删除它并获得如下预期输出中的输出。
命令:
printf "12345";printf "\r67";
Run Code Online (Sandbox Code Playgroud)
输出:
67
Run Code Online (Sandbox Code Playgroud)
预期产出
67345
Run Code Online (Sandbox Code Playgroud) 我正在尝试获取envshell 变量中的输出并打印它。
#!/bin/sh
ENV_BEFORE=$(env)
printf $ENV_BEFORE
Run Code Online (Sandbox Code Playgroud)
结果,env输出中的单个变量被打印出来。
当使用echo代替printf所有输出时,将打印输出,但没有换行符。
我在这里缺少什么?
我有一个数组,其中包含有关每个 NIC 的详细信息。每个数组索引由三个空格分隔的值组成。
我想要一个漂亮的表格作为输出。有没有办法为索引中的每个值分配格式模式?
到目前为止,这是我使用的:
NIC_details[0]='wlp2s0 192.168.1.221 xx:xx:xx:xx:xx:xx'
NIC_details[1]='wwan0 none xx:xx:xx:xx:xx:xx'
NIC_details[2]='virbr0 192.168.122.1 00:00:00:00:00:00'
printf "%-20s\n" "${NIC_details[@]}"
Run Code Online (Sandbox Code Playgroud)
有没有办法通过位置 $1、$2 和 $3 访问数组索引中的值,知道它们是空格分隔的,然后为每个 $X 位置应用格式模式?
我也试过
echo "$i" | column -t
Run Code Online (Sandbox Code Playgroud)
但它并没有带来预期的结果。
我有一个将数字输出到日志文件的命令,我不喜欢数字更改小数位数时的外观,因为它破坏了对齐方式并使一切看起来很混乱。如何强制输出每次都具有相同的小数位数?
前任:
531.125
531.4561
531.3518
531.2
Run Code Online (Sandbox Code Playgroud)
应该:
531.1250
531.4561
531.3518
531.2000
Run Code Online (Sandbox Code Playgroud)
谢谢!
命令
find . -type l -not -xtype l -printf "%p -> %l\n"
Run Code Online (Sandbox Code Playgroud)
打印目录下所有完整的符号链接.。我想将此输出着色,使该%p部分为蓝色。我试过了
find . -type l -not -xtype l -printf '\e[1;34m%-6s\e[m' "%p -> %l\n"
Run Code Online (Sandbox Code Playgroud)
但这会导致错误find: warning: unrecognized escape \e。任何想法如何解决这一问题?
我正在尝试对齐 bashfor循环的输出。
目前,我从循环中得到如下输出:
Directory: /some/long/directory/path Remote: some-remote
Directory: /some/dir/path Remote: other-remote
Run Code Online (Sandbox Code Playgroud)
我试图这样对齐:
Directory: /some/long/directory/path Remote: some-remote
Directory: /some/dir/path Remote: other-remote
Run Code Online (Sandbox Code Playgroud)
生成此输出的当前基本循环如下所示:
Directory: /some/long/directory/path Remote: some-remote
Directory: /some/dir/path Remote: other-remote
Run Code Online (Sandbox Code Playgroud)
我试过使用:
column (分别格式化每一行,因为它是一个 for 循环)printf ( printf "Directory: %s Remote: %s\n" "$dir" "$remote")awk( echo "Directory: $dir Remote: $remote" | awk '{printf ("%s-20s %s-20s %s-20s %s-20s",$1 $2 $3 $4)}')在这些命令的许多其他变体中。
我可能缺少一些基本的东西(我尽力在网上查看其他示例并阅读man页面),但我无法让它工作。
我真的很感激任何关于我做错了什么的指示。
我希望标题能正确解释这一点。我目前正在尝试在计算电子表格中的唯一值后打印出一个数组。
我的 awk 命令工作正常:
awk -F"," 'NR>1{col[$1,$9]++} END {for (i in col) printf("%s: %d\n", i, col[i])}' my_file.csv | sort
Run Code Online (Sandbox Code Playgroud)
虽然打印时我得到一个看起来像问号的特殊字符。
如何在年份和季节之间用逗号 + 空格打印这个。
例如:1896 年,夏天:151
对于我的 powerlevel10k 自定义提示,我目前有此功能来显示自纪元以来的秒数,以逗号分隔。我将它显示在当前时间下,这样我总是有一个提示来大致记住当前纪元时间是什么。
function prompt_epoch() {
MYEPOCH=$(/bin/date +%s | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')
p10k segment -f 66 -t ${MYEPOCH}
}
Run Code Online (Sandbox Code Playgroud)
有人告诉我可以使用以下命令在没有分叉进程的情况下执行此操作:
$ zmodload -F zsh/datetime p:EPOCHSECONDS
$ printf "%'d" $EPOCHSECONDS
1,648,943,504
Run Code Online (Sandbox Code Playgroud)
但我不确定如何在不分叉的情况下做到这一点。我知道在获取 powerlevel10k 之前zmodload在 my 中添加该行,但是我不知道如何在没有 fork 的情况下进行格式化。~/.zshrc${EPOCHSECONDS}
如果我按照我知道的方式做,这就是我会做的:
function prompt_epoch() {
MYEPOCH=$(printf "%'d" ${EPOCHSECONDS})
p10k segment -f 66 -t ${MYEPOCH}
}
Run Code Online (Sandbox Code Playgroud)
但据我了解,每次调用提示时仍然会分叉一个进程,对吗?我是否误解了给出的建议,因为我认为我无法找到一种方法来获取最新纪元秒数而不运行某种需要分叉的进程,对吗?
printf ×10
bash ×4
shell ×2
array ×1
awk ×1
command-line ×1
find ×1
ksh ×1
numeric-data ×1
quoting ×1
shell-script ×1
utilities ×1
zsh ×1