이전 명령(파이프라인)의 인수를 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 ▄▄▄▄▄▄▄▄▄▄▄

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   ◼

"큰 문제"는 아니지만 업무에 필요한 것입니다... 미래에 누군가 필요할 경우를 대비해서 말이죠.

관련 정보