printf 以及如何在变量及其值之间添加点“...”

printf 以及如何在变量及其值之间添加点“...”

我们有以下输出

猫 gh.log

 machine              status               
 =============================================================
 connection_ght 400
 pach_po 72
 timeout 311
 ping_agent 119675
 rt_machine 231
 ginco_snmp   14
 .
 .
 .
 .

如何使用printf

 machine              status               
 =============================================================
 connection_ght..... 400
 pach_po............ 72
 timeout............ 311
 ping_agent......... 119675
 rt_machine......... 231
 ginco_snmp ........ 14

答案1

将点线添加到前往 的字符串中printf,并将printf其切成一定长度。在外壳中:

$ for x in a bbb cccccc ; do 
    printf '%.20s %s\n' "$x.................................." blah;
  done
a................... blah
bbb................. blah
cccccc.............. blah

awk

$ printf "a 123\nbbbbbb 456\n" | 
    awk '{printf "%.20s %s\n", $1 ".....................", $2}'
a................... 123
bbbbbb.............. 456

%N.Ms是字段的最小宽度,中号最大值。


要将第一个片段转换为第二个片段,您可以执行以下操作:

$ awk 'NR <= 2 {print; next} {printf "%.20s %s\n", $1 ".....................", $2}' < gh.log
machine              status               
=============================================================
connection_ght...... 400
pach_po............. 72
etc.

条件NR <= 2 {print; next}按原样传递前两行,其余部分按上述方式转换。请注意,这假设没有其他列等。适应口味。


printf可以将字段宽度作为单独的参数,如果你将 a*放在它的位置,所以我们也可以这样做:

printf '%s%.*s %s\n' "$x" $(( 20 - ${#x} )) "................................" blah

${#x}是变量的长度x。)这将使字符串和填充符分开,但对于 shell 或awk.它在 C 代码中可能很有用,因为字符串操作的内存管理比较烦人。

相关内容