フィルタリングしようとしています。最も一般的に使用されるコマンドそして何とか印刷してみてください。これまでに必要な「フィルター」を正常に配置しました。
$ 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
またはを使用したいのですが、printf
出力形式を指定する方法がわかりません。また、コマンドと次の列(番号付けを使用)の間のスペースを管理するのは難しいです。 3番目の列は2番目の列と1つのカンマンスペースです。
添付:▄の尺度は任意の値にすることができます。
答え1
xargs
私はあなたが最初の部分を探していると思います。たとえば、
$ echo foo bar| xargs printf "- %s - %s -\n"
- foo - bar -
printfの出力を入力して左に調整するには、次のようにします。
$ echo foobar 19 | xargs printf '%-30s %s'
foobar 19
形式が最も長いコマンド名を受け入れて列を生成するには、最初の列で最も長い引数の長さを確認してから、すべての入力を読み取るまで結果を印刷しないより複雑なものを作成する必要があります。たとえばawk
。
答え2
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
- 幅=最大(20、長さ(str))、ソート=左"%20s",str
- 幅 = max(20, len(str)), ソート = 右"%.20s",str
- width=min(20,len(str)), len>20 なら切り捨て"%20.20s,str
- 幅=20、len>20の場合、切り捨て、整列=右"%*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 ◼
「大きな問題」ではありませんが、仕事に必要なものです。