标签: printf

bash + 使用 printf 以特殊格式打印

我刚刚编写了以下 bash 脚本来检查 Linux 机器列表上的 ping 访问:

for M in $list
 do
   ping -q -c 1  "$M" >/dev/null 
          if [[ $? -eq 0 ]]
   then
    echo "($C) $MACHINE CONNECTION OK"
   else
    echo "($C) $MACHINE CONNECTION FAIL"
   fi

   let C=$C+1
done
Run Code Online (Sandbox Code Playgroud)

这打印:

 (1) linux643 CONNECTION OK
 (2) linux72 CONNECTION OK
 (3) linux862 CONNECTION OK
 (4) linux12 CONNECTION OK
 (5) linux88 CONNECTION OK
 (6) Unix_machinetru64 CONNECTION OK
Run Code Online (Sandbox Code Playgroud)

如何printf在我的 bash 脚本中使用(或任何其他命令)来打印以下格式?

 (1) linux643 ............ CONNECTION OK
 (2) linux72 ............. CONNECTION OK …
Run Code Online (Sandbox Code Playgroud)

bash shell-script printf

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

用另一个字符填充字符串中的尾随空格

我想输出hello world超过 20 个字符。

printf "%-20s :\n\n" 'hello world!!'

# Actual output
hello world!!        :

# Wanted output
hello world!!========:
Run Code Online (Sandbox Code Playgroud)

但是,我不想用空格来完成,而是用“ = ”来代替。我怎么做?

shell bash string printf

14
推荐指数
6
解决办法
5530
查看次数

如何阻止 Bash 解释八进制代码而不是整数?

我正在编写一个星座 RSS 脚本作为 Unix/Linux 项目的介绍,但遇到了一个问题,我的教授无法在我下课后留下来解决这个问题。由于我无法弄清楚如何使用实际日期作为要检查的内容,因此我想通过让用户输入为 MMDD 格式的标准数字来尝试基本算术。据他说,该脚本似乎将输入读取为八进制代码而不是整数。这是脚本的示例:

    elif [ "$olddate" -gt 1121 ] && [ "$olddate" -lt 1131 ] || [ "$olddate" -gt 1200 ] && [ "$olddate" -lt 1222 ]
then
echo "You are Sagittarius"
exit
elif [ "$olddate" -gt 1221 ] && [ "$olddate" -lt 1232 ] || [ "$olddate" -gt 0100 ] && [ "$olddate" -lt 0120 ]
then
echo "You are Capricorn"
exit
Run Code Online (Sandbox Code Playgroud)

这是最基本的,我拿出了RSS部分。“olddate”是我阅读提示中的预期输入。虽然 1121 到 1131、1200 到 1222 和 0100 到 0120 有效,但 1221 到 …

bash numeric-data printf

13
推荐指数
1
解决办法
4006
查看次数

找到模式后才打印输出

有一个脚本(我们称之为echoer)可以打印以筛选一堆信息。我希望只能在找到模式后才能看到线条。

我想象使用解决方案看起来像

echoer | solution_command <pattern>
Run Code Online (Sandbox Code Playgroud)

理想情况下pattern是一个正则表达式,但硬值字符串对我来说就足够了。

echo printf

13
推荐指数
2
解决办法
2804
查看次数

如何在不剥离任何尾随换行符的情况下将 stdin 捕获到变量?

在 shell 脚本中...

如何在不剥离任何尾随换行符的情况下将 stdin 捕获到变量?

现在我已经尝试过:

var=`cat`
var=`tee`
var=$(tee)
Run Code Online (Sandbox Code Playgroud)

在所有情况下$var都不会有输入流的尾随换行符。谢谢。

另外:如果输入中没有尾随换行符,则解决方案不得添加.

根据接受的答案更新:

我在代码中使用的最终解决方案如下:

function filter() {
    #do lots of sed operations
    #see https://github.com/gistya/expandr for full code
}

GIT_INPUT=`cat; echo x`
FILTERED_OUTPUT=$(printf '%s' "$GIT_INPUT" | filter)
FILTERED_OUTPUT=${FILTERED_OUTPUT%x}
printf '%s' "$FILTERED_OUTPUT"
Run Code Online (Sandbox Code Playgroud)

如果您想查看完整代码,请查看expandr的 github 页面,这是我为信息安全目的开发的一个小的开源git 关键字扩展过滤器shell 脚本。根据.gitattributes文件(可以是特定于分支的)和git config 中设置的规则,无论何时检入或检出存储库,git 都会通过expandr.sh shell 脚本通过管道传输每个文件。(这就是为什么保留任何尾随换行符或缺少换行符至关重要。)这使您可以清理敏感信息,并为测试、暂存和实时分支交换不同的环境特定值集。

shell shell-script echo newlines printf

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

printf 如何将一半四舍五入到小数点后第一位?

我正在printf我的系统上测试两种不同的实现:printf (GNU coreutils) 8.26,以及与zsh 5.3.1. 我正在测试半数是如何四舍五入的,即 1.5、2.5、3.5、... 9.5。

$ for i in {1..9}; do /usr/bin/printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10
$ for i in {1..9}; do printf '%.0f\n' "${i}.5"; done
2
2
4
4
6
6
8
8
10
Run Code Online (Sandbox Code Playgroud)

在这里,两者显然都是半圆的。但是,当我测试四舍五入到第一个小数位时,事情变得混乱。也就是说,我正在测试 1.15、1.25、1.35、... 1.95。

$ for i in {1..9}; do /usr/bin/printf '%.1f\n' "1.${i}5"; done
1.1
1.2
1.4
1.5
1.5
1.6
1.8
1.9
2.0
$ for i in …
Run Code Online (Sandbox Code Playgroud)

math printf

11
推荐指数
1
解决办法
963
查看次数

用零填充数字

我正在尝试将零填充到一个数字

a=010
printf "%04d" $a
0008
Run Code Online (Sandbox Code Playgroud)

我需要“输出”为“0010”,它正在转换值。

甚至尝试排版

a=010
typeset -RZ2 a
echo $a
Run Code Online (Sandbox Code Playgroud)

当我在脚本中使用它时,出现以下错误:

Invalid -R option
Run Code Online (Sandbox Code Playgroud)

printf typeset

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

为什么`printf "%s"` 将以下两个字符串连接在一起?

$ printf "%s" a b
ab$ printf "%s%s" a b
ab
Run Code Online (Sandbox Code Playgroud)

我在理解printf. 如果我是对的,它与 C 编程语言中的字符串大致相同。

为什么格式说明符%s将以下两个字符串连接在一起?

为什么不 %s意味着只有一个字符串来替代它,而忽略剩余的字符串?

为什么两个字符串下%s和下%s%s的结果相同?

bash printf

10
推荐指数
2
解决办法
3615
查看次数

使用 awk 修改具有可变数量字段的文件中第一列的宽度

我了解如何使用 awk 的 printf 函数,但我不想指定每个字段。

例如,假设这是我的文件:

c1|c2|c3|c4|c5
c6|c7|c8|c9|c10
c11|c12|c13|c14|c15
Run Code Online (Sandbox Code Playgroud)

我想格式化它,以便每条记录的第一个字段都是 c11 的宽度——第一个字段中最长的单元格:

c1 |c2|c3|c4|c5
c6 |c7|c8|c9|c10
c11|c12|c13|c14|c15
Run Code Online (Sandbox Code Playgroud)

我知道我可以指定:

awk -F"|" '{printf "%-3s%s%s%s%s\n", $1, $2, $3, $4, $5}' file > newfile
Run Code Online (Sandbox Code Playgroud)

假设我知道我想要第一列的宽度是多少,但我不知道文件中有多少个字段。基本上我想做类似的事情:

... '{printf "%-3s|", $1}'
Run Code Online (Sandbox Code Playgroud)

...然后以原始格式打印其余字段。

awk printf text-formatting

10
推荐指数
2
解决办法
573
查看次数

bash 脚本,在框中回显输出

我创建了这个函数,它打印输出,如示例图像中所示。但是,这个功能的实现似乎太复杂了。

有什么方法可以改进它或实施替代解决方案吗?

这是执行带有字符串参数“Love Unix & Linux”的“box_out”函数后的输出示例

#!/bin/bash
function box_out() {
    input_char=$(echo "$@" | wc -c)
    line=$(for i in `seq 0 $input_char`; do printf "-"; done)
    # tput This should be the best option. what tput does is it will
    # read the terminal info and render the correctly escaped ANSI code
    # for you.
    # Code like \033[31m will break the readline library in some of the
    # terminals.
    tput bold
    line="$(tput setaf 3)${line}"
    space=${line//-/ }
    echo " ${line}"
    printf '|' ; echo -n …
Run Code Online (Sandbox Code Playgroud)

shell-script tput printf

9
推荐指数
3
解决办法
1万
查看次数