我们有以下输出
猫 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 代码中可能很有用,因为字符串操作的内存管理比较烦人。