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文字(*)幅のフィールドに印刷されます。%-20s
20文字にしてオーバーフローを削除します。%-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 mounted
1つに縮小されました。これは、awk
フィールドが変更されたときにフィールド全体が再作成されるために発生します。$0
NF
/was8/coreproduct is mounted OK
答え2
混乱したPerl:
perl -ne 'printf "%-40s %s", /(.*) (.*)/s'
答え3
1つの方法は、ステータスコードの前にタブを追加することです。たとえば、次のようになります。
<input rev | sed 's/ /\t/' | rev | column -s $'\t' -t
出力:
/ 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
/was8/ihs is mounted OK
/was8/backup is mounted OK
/was8/ihs/logs is mounted OK
/was8/wsdm is mounted OK
/was8/ws is mounted OK
/was8/ihs/logs/analysis is mounted OK
答え4
これは、列ユーティリティを使用して簡単に行うこともできます。鍵となるのは、「列」の間に一種の区別表示を含めることです。たとえば、スペースが区別されるマーカーであれば、column -s ' ' -o ' ' -t
空間的に完全に整列します。
私はそれをたくさん使用し、私のコードをソートするために使用する素晴らしいvimマクロを作成しました。必要な一般的な構文は次のとおりです。
column -s <Separator String> -o <Separator String in Output> -t
これはタブベースの回答を一般化したものですが、必ずしもタブを挿入する必要はありません。