
我有一個腳本,可以根據 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
重建整個欄位。$0
NF
/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
這是基於選項卡的答案的概括,但不一定需要插入選項卡。