我正在尝试过滤最常用的命令并以某种方式打印出来。到目前为止,我已经成功放置了所需的“过滤器”:
$ 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
or 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 ◼
不是什么“大事”,但是我在工作中需要的东西......以防万一以后有人需要它。