echoまたはprintを使用して複数行を並べ替える方法

echoまたはprintを使用して複数行を並べ替える方法

fstabの下にリストされているエントリに基づいてマウントされたファイルシステムを確認するスクリプトがあります。ここで直面する問題は、出力を整列したままにすることです。

以下はスクリプト出力です。

/  is mounted OK
/boot  is mounted OK
/was8  is mounted OK
/was8/slogs  is mounted OK
/was8/cluster  is mounted OK
/was8/working  is mounted OK
/was8/app  is mounted OK
/was8/tools  is mounted OK
/was8/plugin  is mounted OK
/was8/coreproduct  is mounted OK
...

線を整列したままにしたいので、次のようにする必要があります。

/  is mounted                       OK
/boot  is mounted                   OK
/was8  is mounted                   OK
/was8/slogs  is mounted             OK
/was8/cluster  is mounted           OK
/was8/working  is mounted           OK
/was8/app  is mounted               OK
/was8/tools  is mounted             OK
/was8/plugin  is mounted            OK
/was8/coreproduct  is mounted       OK
...

列とxargsを試しましたが、目的の結果を取得できませんでした。誰か私を助けてください。

ベストアンサー1

通常、印刷するときに書式文字列の幅をprintf。文字列は、オーバーフローしない限り、20文字(*)幅のフィールドに印刷されます。%-20s20文字にしてオーバーフローを削除します。%-20.20s

(*例えば、Bashはprintf本当に重要ですが、バイト。違いはUTF-8などの文字で確認できますä。 )

例えば

printf "%-40s %s\n" "$mountpoint  is mounted" "$status"

最初の部分の幅は(少なくとも)40文字です。

/was8/coreproduct  is mounted            OK
...

または、これらの入力を後処理する必要がある場合は、Perlまたはawkを使用できます。

perl -pe 's/(.*) +(\S+)$/ sprintf "%-40s %s", $1, $2 /e'  < file

awk '{s=$NF; sub(/ *[^ ]+ *$/, "", $0); printf "%-40s %s\n", $0, s}'  < file

両方とも、デフォルトでは空白ではなく最後の文字列を分離し、固定幅フィールドの最初の部分と一緒に2つの部分を印刷します。


あるいは、フィールド間の区別をまったく同じに保つことを気にしなければ、@はより簡単な解決策に注釈を付けました。ジョアオする:

awk '{s=$NF; NF-- ; printf "%-40s %s\n", $0, s}' < file

これにより、次のような出力が生成されます。以前の2つのスペースがis mounted1つに縮小されました。これは、awkフィールドが変更されたときにフィールド全体が再作成されるために発生します。$0NF

/was8/coreproduct is mounted             OK

おすすめ記事