Передача аргументов из предыдущих команд (каналов) функции awk / printf и форматирования вывода

Это сценарий bash, поэтому процесс выполняет / bin / bash . Это нормально.

Скрипт открывается процессом bash. Используйте ls -l / proc / 20071 / fd или lsof -p 20071 , чтобы перечислить файлы, открытые этим процессом. По умолчанию вы найдете сценарий в файловом дескрипторе 255.

cat /proc/20071/fd/255

(Причина появления фонетических символов и диакритических знаков на вашем терминале и то, как это происходит, - это разные вопросы, по которым у вас пока нет достаточной информации.)

0
13.05.2018, 23:37
3 ответа

Siguiendo el enfoque de PO, reemplace awk por Perl --'Perl -ae' es muy similar a awk...

... | perl -ae ' printf "%-20s %d %s\n", $F[0], $F[1],"▄"x$F[1]'
aa                  12 ▄▄▄▄▄▄▄▄▄▄▄▄
bb                  23 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄

Edite :con Awk, podría ejecutar algo similar a

... | awk '{printf "%-20s %d %.*s\n",$1,$2,$2,"▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄"}'

printfLos formatos de función(utilizados en C, Awk, Perl, printfcomando, etc. )pueden ser un poco complicados. Siguiendo algunos ejemplos con cadenas:

  • "%.20s,str-ancho = máximo (20, longitud (str )), alineación = izquierda
  • "%20s",str-ancho = máximo (20, longitud (cadena )), alineación = derecho
  • "%.20s",str-width=min (20,len (str )), se trunca si len>20
  • "%20.20s,str-ancho=20, se trunca si largo>20,alinear = derecha
  • "%*s",30,str-esprintt("%30s",str)
  • "%.*s",30,str-esprintt("%.30s",str)
1
28.01.2020, 02:32

Con la ayuda de @JJoao, esto es lo que se me ocurrió más adelante:

$ 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   ◼

No es un "gran problema", pero es algo que necesito en el trabajo... en caso de que alguien lo necesite más adelante.

1
28.01.2020, 02:32

Creo que estás buscando xargspara la primera parte. Por ejemplo:

$ echo foo bar| xargs printf "- %s - %s -\n"
- foo - bar -

Para rellenar y ajustar a la izquierda la salida de printf, puede hacer algo como:

$ echo foobar 19 | xargs printf '%-30s %s'
foobar                         19

Para asegurarse de que el formato se adapte al nombre de comando más largo y para crear la barra, probablemente tendrá que escribir algo más complicado que verifique la longitud del argumento más largo en la primera columna y luego no se imprima. los resultados hasta que haya leído toda la entrada, por ejemplo usando awk.

2
28.01.2020, 02:32

Теги

Похожие вопросы