Bash

將來自先前命令(管道)的參數傳遞給 awk/printf 函式並格式化輸出

  • May 15, 2018

我正在嘗試過濾最常用的命令並以某種方式列印出來。到目前為止,我已經設法放置了所需的“過濾器”:

$ 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 ▄▄▄▄▄▄▄▄▄▄▄

我想使用awkor printf,但我不知道如何格式化輸出。此外,管理命令和下一列(使用次數)之間的空間也很棘手——第三列與第二列之間只有一個空格。


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.

引用自:https://unix.stackexchange.com/questions/443578