Bash

printf 以及如何在變數及其值之間添加點“…”

  • January 2, 2018

我們有以下輸出

貓 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

將點線添加到去 的字元串中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是欄位的最小寬度,M是最大值。%*N*.*M*s


要將第一個片段轉換為第二個片段,您可以執行以下操作:

$ 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 程式碼中可能很有用,因為字元串操作的記憶體管理更煩人。

引用自:https://unix.stackexchange.com/questions/414333