将参数从先前的命令(管道)传递到 awk/printf 函数并格式化输出

将参数从先前的命令(管道)传递到 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 ▄▄▄▄▄▄▄▄▄▄▄

我想使用awkor printf,但我不知道如何格式化输出。此外,管理命令和下一列(使用编号)之间的空间也很棘手——第三个与第二个仅一个空格。


附:▄ 的标度可以是任何值。

答案1

我认为您正在寻找xargs第一部分。例如:

$ echo foo bar| xargs printf "- %s - %s -\n"
- foo - bar -

要 pad 和 left 调整 printf 的输出,您可以执行以下操作:

$ echo foobar 19 | xargs printf '%-30s %s'
foobar                         19

为了确保格式适应最长的命令名称并创建栏,您可能需要编写更复杂的内容来检查第一列上最长参数的长度,然后不打印结果,直到它已读取所有输入,例如使用awk.

答案2

按照 PO 的方法,用 Perl 替换 awk ——“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- 宽度=最大(20,长度(str)),对齐=左
  • "%20s",str - 宽度=最大(20,len(str)),对齐=右
  • "%.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)

答案3

在@JJoao的帮助下,这是我后来想到的:

$ history | tr -s ' ' | cut -d ' ' -f3 | sort | uniq -c | sort -nr | head | awk '{ printf "%-25s %-4d", $2, $1, n = $1 / 5; s = sprintf("%*.s", n, ""); gsub(/ /, "◼", s); print s }'
history                   227 ◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼
./rebar3                  30  ◼◼◼◼◼◼
cat                       26  ◼◼◼◼◼
cd                        24  ◼◼◼◼
docker                    21  ◼◼◼◼
ps                        20  ◼◼◼◼
bin/erlang_cowboy         19  ◼◼◼
sudo                      13  ◼◼
nix-env                   8   ◼
nix-channel               8   ◼

不是什么“大事”,但是我在工作中需要的东西......以防万一以后有人需要它。

相关内容