필터링 하려고 하는데가장 일반적으로 사용되는 명령그리고 어떻게든 인쇄해 보세요. 지금까지 필요한 "필터"를 성공적으로 배치했습니다.
$ 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
출력 형식을 지정하는 방법을 모르겠습니다. 또한 명령과 다음 열(번호 매기기를 사용함) 사이의 공백을 관리하는 것은 까다롭습니다. 세 번째 열은 두 번째 열과 한 칸만 공백입니다.
첨부된:▄의 척도는 임의의 값이 될 수 있습니다.
답변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 ◼
"큰 문제"는 아니지만 업무에 필요한 것입니다... 미래에 누군가 필요할 경우를 대비해서 말이죠.