Bash
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
將點線添加到去 的字元串中
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 程式碼中可能很有用,因為字元串操作的記憶體管理更煩人。