web-dev-qa-db-ja.com

フォーマットされたシェルスクリプトの出力

printfを使用して出力幅を修正するにはどうすればよいですか?

これはスクリプトの例です:

#!/bin/bash
OK=$(printf '\t%+50s\n' OK)
FAIL=$(printf '\t%+50s\n' FAIL)
for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do
        echo "$i $OK"
done

出力:

a                                                       OK
aa                                                      OK
aaa                                                     OK
aaaa                                                    OK
aaaaaa                                                  OK
aaaaaaaaaaaaaaaaa                                                  OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                                               OK

私は次のようなものが欲しい:

a                                                       OK
aa                                                      OK
aaa                                                     OK
aaaa                                                    OK
aaaaaa                                                  OK
aaaaaaaaaaaaaaaaa                                       OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                              OK
6
Leonardo Ortiz

簡単な方法:

スクリプトをcolumn -tにパイプします

$ script.sh | column -t
a                           OK
aa                          OK
aaa                         OK
aaaa                        OK
aaaaaa                      OK
aaaaaaaaaaaaaaaaa           OK
aaaaaaaaaaaaaaaaaaaaaaaaaa  OK
20
John Goofy

次のprintfアプローチを使用して、必要な出力を取得します。

#!/bin/bash
for i in a aa aaa aaaa aaaaaa aaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa; do
    printf '%-50sOK\n' $i 
done

スクリプト出力:

a                                                 OK
aa                                                OK
aaa                                               OK
aaaa                                              OK
aaaaaa                                            OK
aaaaaaaaaaaaaaaaa                                 OK
aaaaaaaaaaaaaaaaaaaaaaaaaa                        OK

  • OK-静的文字列が[〜#〜] format [〜#〜]printf FORMAT [ARGUMENT]

  • $i-printf引数と見なされます

18
RomanPerekhrest

出力をフォーマットするツールを使用せず、$iが広くなると、出力の調整に失敗します。

交換する

echo "$i $OK"

printf "%-50s %s\n" "$i" "$OK"

(「foo」を実際の文字列に置き換えます)。

どこ

  • 50sは、固定幅の50文字の文字列です。
  • -(マイナス)文字列を左揃えにします。
  • 見る man 3 printf形式文字列の詳細については。
5
Archemar