如何使用 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
...

我已經嘗試了 column 和 xargs 無法獲得所需的結果。有人可以幫我弄這個嗎。

答案1

一般來說,在進行列印時,可以將格式字串中的寬度設定為printf。將在 20 個字元(*)%-20s寬的欄位上列印字串,除非它溢出。會將其變為 20 個字元並刪除任何溢出的部分。%-20.20s

(* 雖然例如 Bashprintf其實很重要位元組。可以透過 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

兩者基本上都分隔最後一個非空白字串,然後將兩個部分與第一個部分列印在固定寬度欄位上。


或者,如果您不關心保持字段之間的分隔完全相同,@ 評論了一個更簡單的解決方案喬奧將會:

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

這會產生以下輸出。請注意,前面的兩個空格is mounted已折疊為一個。發生這種情況是因為當或任何欄位被修改時awk重建整個欄位。$0NF

/was8/coreproduct is mounted             OK

答案2

只是一些令人困惑的 Perl:

perl -ne 'printf "%-40s %s", /(.*) (.*)/s'

答案3

一種方法是在狀態代碼之前引入一個選項卡,例如:

<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

這是基於選項卡的答案的概括,但不一定需要插入選項卡。

相關內容