Как записать вывод команды bash в табличном формате с заданным интервалом - PullRequest
0 голосов
/ 13 апреля 2020
 2   0   0   184
 2   0   0   184
 765311      61423       6454323302  470948
 598500      678403      6454288800  1810469

Я использовал grep <command output> | cut -d ':' -f 3 | column -x >> $temp для записи данных в табличном формате. Но кажется, что длина строк огромна, что приводит к перекосу таблицы. Мне нужно отформатировать их с равным интервалом. Как я могу это сделать?

Редактировать: файл, в котором запускается команда, содержит следующий текст:

total_STDIO_OPENS: 176400
total_STDIO_FDOPENS: 0
total_STDIO_READS: 5881999200
total_STDIO_WRITES: 276435
total_STDIO_SEEKS: 0
total_STDIO_FLUSHES: 0
total_STDIO_BYTES_WRITTEN: 7689144
total_STDIO_BYTES_READ: 53954527200
total_STDIO_MAX_BYTE_READ: 917480
total_STDIO_MAX_BYTE_WRITTEN: 176
total_STDIO_FASTEST_RANK: 81759
total_STDIO_FASTEST_RANK_BYTES: 917712
total_STDIO_SLOWEST_RANK: 137230
total_STDIO_SLOWEST_RANK_BYTES: 917729
total_STDIO_F_META_TIME: 235319.135093
total_STDIO_F_WRITE_TIME: 2.271446
total_STDIO_F_READ_TIME: 1204.541221
total_STDIO_F_OPEN_START_TIMESTAMP: 0.000000
total_STDIO_F_CLOSE_START_TIMESTAMP: 0.000000
total_STDIO_F_WRITE_START_TIMESTAMP: 6.714122
total_STDIO_F_READ_START_TIMESTAMP: 0.000000
total_STDIO_F_OPEN_END_TIMESTAMP: 6.782347
total_STDIO_F_CLOSE_END_TIMESTAMP: 6.856372
total_STDIO_F_WRITE_END_TIMESTAMP: 346.306913
total_STDIO_F_READ_END_TIMESTAMP: 6.856351
total_STDIO_F_FASTEST_RANK_TIME: 0.000000
total_STDIO_F_SLOWEST_RANK_TIME: 0.000000
total_STDIO_F_VARIANCE_RANK_TIME: 0.000000
total_STDIO_F_VARIANCE_RANK_BYTES: 0.000000

Я grep использую grep -Ein 'total_stdio_read|total_posix_write|total_stdio_write|total_posix_read' $file | cut -d ':' -f 3 | column -x >> $temp

Желаемый вывод:

2           0           0           184
2           0           0           184
765311      61423       6454323302  470948
598500      678403      6454288800  1810469

Ответы [ 3 ]

0 голосов
/ 13 апреля 2020

Я предполагаю, что вы хотите, чтобы длина 10 символов на столбец плюс 2 символа дополнительного интервала. Увеличьте длину, если данные не помещаются в столбцы (данные не усекаются).

xargs и printf:

$ <your commands> | xargs -n4 printf '%-10s  %-10s  %-10s  %-10s\n'
2           0           0           184
2           0           0           184
765311      61423       6454323302  470948
598500      678403      6454288800  1810469

awk и printf:

$ <your commands> | awk '{for(i=1;i<=NF;i++) printf "%-10s%s", $i, (i==NF ? ORS : "  ")}'
2           0           0           184
2           0           0           184
765311      61423       6454323302  470948
598500      678403      6454288800  1810469

Или просто column -t:

$ <your commands> | column -t
2       0       0           184
2       0       0           184
765311  61423   6454323302  470948
598500  678403  6454288800  1810469
0 голосов
/ 13 апреля 2020

Так что для меня сработало сочетание решений.

<command output> | cut -d ' ' -f 2 | column -x | xargs -n4 printf '%-10d %-10d %-10d %-10d\n'

0 голосов
/ 13 апреля 2020

Используйте встроенную функцию BASH printf. Он имеет тот же синтаксис для форматирования, что и C printf (), поэтому существует множество параметров.

Пример:

$ printf "%-20s %3f\n" abc 3.4
abc                  3.400000
...