Bash
將來自先前命令(管道)的參數傳遞給 awk/printf 函式並格式化輸出
我正在嘗試過濾最常用的命令並以某種方式列印出來。到目前為止,我已經設法放置了所需的“過濾器”:
$ history | tr -s ' ' | cut -d ' ' -f3 | sort | uniq -c | sort -n | tail | awk '{ printf "%s%20s\n", $2, $1 }'
…但我無法正確獲得輸出。
我希望能夠顯示最終輸出,例如:
checkupdates 16 ▄▄▄ find 16 ▄▄▄ ./gradlew 17 ▄▄▄ ./rebar3 21 ▄▄▄▄ nix-env 24 ▄▄▄▄ cd 26 ▄▄▄▄▄ docker 33 ▄▄▄▄▄▄ rebar3 43 ▄▄▄▄▄▄▄▄ sudo 46 ▄▄▄▄▄▄▄▄▄ flatpak 56 ▄▄▄▄▄▄▄▄▄▄▄
我想使用
awk
orprintf
,但我不知道如何格式化輸出。此外,管理命令和下一列(使用次數)之間的空間也很棘手——第三列與第二列之間只有一個空格。PS: ▄的比例可以是任何東西。
按照 PO 的方法,將 awk 替換為 Perl——“Perl -ae”與 awk 非常相似…
... | perl -ae ' printf "%-20s %d %s\n", $F[0], $F[1],"▄"x$F[1]'
aa 12 ▄▄▄▄▄▄▄▄▄▄▄▄ bb 23 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
編輯:使用 Awk,您可以按照以下方式執行
... | awk '{printf "%-20s %d %.*s\n",$1,$2,$2,"▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"}'
printf
函式格式(用於 C、Awk、Perl、printf
命令等)可能有點棘手。以下是一些帶有字元串的範例:
"%.20s,str
- 寬度=max(20,len(str)), 對齊=左"%20s",str
- 寬度=max(20,len(str)), 對齊=rigth"%.20s",str
- width=min(20,len(str)),如果 len>20 則截斷"%20.20s,str
- width=20 , 如果 len>20 則截斷, align=right"%*s",30,str
- 是printt("%30s",str)
"%.*s",30,str
- 是printt("%.30s",str)
我想你正在尋找
xargs
第一部分。例如:$ echo foo bar| xargs printf "- %s - %s -\n" - foo - bar -
要填充和左調整 printf 的輸出,您可以執行以下操作:
$ echo foobar 19 | xargs printf '%-30s %s' foobar 19
為了確保格式適應最長的命令名稱並創建條形圖,您可能必須編寫更複雜的東西來檢查第一列上最長參數的長度,然後直到列印結果它已讀取所有輸入,例如使用
awk
.