我正在尝试过滤最常用的命令并以某种方式打印出来。到目前为止,我已经设法放置了所需的“过滤器”:
$ 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
,但我不知道如何格式化输出。此外,管理命令和下一列(使用次数)之间的空间也很棘手——第三列与第二列之间只有一个空格。
PS: ▄的比例可以是任何东西。
我想你正在寻找
xargs
第一部分。例如:要填充和左调整 printf 的输出,您可以执行以下操作:
为了确保格式适应最长的命令名称并创建条形图,您可能必须编写更复杂的东西来检查第一列上最长参数的长度,然后直到打印结果它已读取所有输入,例如使用
awk
.按照 PO 的方法,将 awk 替换为 Perl——“Perl -ae”与 awk 非常相似...
编辑:使用 Awk,您可以按照以下方式运行
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)
在@JJoao 的帮助下,这是我后来想到的:
不是什么“大事”,而是我在工作中需要的东西……以防以后有人需要。