объединить столбцы строки n + 1 в строку n - PullRequest
0 голосов
/ 13 июня 2018

iostat может показывать постоянные имена устройств (с -j id) вместо имен устройств ядра (например, sda), но это также подразумевает опцию -h для «читабельного человеком» вывода.Это приводит к выводу, подобному этому (строка, которая содержит постоянное имя диска, например, HOMES или DATADISK, а следующая строка содержит значения для этого диска).

(в моем примере я передал вывод iostat в awk'// {print strftime ("% Y-% m-% d% H:% M:% S"), $ 0}', чтобы иметь метку времени в начале каждой строки):

2018-06-13 11:57:03 HOMES
2018-06-13 11:57:03                   0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
2018-06-13 11:57:03 ARCHIVEDISK
2018-06-13 11:57:03                   0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:03 DATADISK
2018-06-13 11:57:03                   0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
2018-06-13 11:57:05 HOMES
2018-06-13 11:57:05                   0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:05 ARCHIVEDISK
2018-06-13 11:57:05                   0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:05 DATADISK
2018-06-13 11:57:05                   0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90

Как я могу объединить строки, чтобы я получил это:

2018-06-13 11:57:03 HOMES             0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
2018-06-13 11:57:03 ARCHIVEDISK       0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:03 DATADISK          0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
2018-06-13 11:57:05 HOMES             0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:05 ARCHIVEDISK       0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-13 11:57:05 DATADISK          0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90

Ответы [ 4 ]

0 голосов
/ 22 июня 2018

Если вывод iostat выглядит следующим образом:

$ cat file
HOMES
                  0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
ARCHIVEDISK
                  0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
DATADISK
                  0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
HOMES
                  0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
ARCHIVEDISK
                  0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
DATADISK
                  0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90

, то все, что вам нужно, это 1 маленькая простая команда awk (с использованием cat file вместо iostat ниже):

$ cat file | awk 'NR%2{dev=$0; next} {printf "%s %-18s %s\n", strftime("%F %T"), dev, substr($0,19)}'
2018-06-22 10:34:09 HOMES              0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    1.00    0.00    1.00   1.00   0.05
2018-06-22 10:34:09 ARCHIVEDISK        0.00     0.00    0.00    0.50     0.00     2.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-22 10:34:09 DATADISK           0.00     0.00   86.00    0.50   680.00     2.00    15.77     0.12    1.40    1.41    1.00   1.26  10.90
2018-06-22 10:34:09 HOMES              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-22 10:34:09 ARCHIVEDISK        0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
2018-06-22 10:34:09 DATADISK           0.00     0.00  122.00  116.00   976.00  1164.00    17.98     0.56    2.33    3.36    1.26   1.47  34.90

Нет необходимости добавлять временные метки, а затем снова их удалять, без необходимости вызывать strftime, проходить по полям, каналам, вызывать «столбец», который испортит исходное выравнивание и т. Д.

0 голосов
/ 13 июня 2018

Perl для спасения:

perl -pe 'if ($. % 2) {
    chomp;
    $l = length;
} else {
    s/^.{19} */" " x (38 - $l)/e;
}' -- file
  • $. содержит номер строки ввода
  • % является оператором по модулю, т.е. $. % 2 возвращает true для строк1, 3, 5, 7 и т. Д.
  • /e интерпретирует заменяющую часть замены s/// как код, здесь он повторяет пробел 38 - $l раз, где $l - длинапредыдущая строка (для выравнивания чисел)
0 голосов
/ 13 июня 2018

awk, поддерживает интервал:

awk '
    NR % 2 {label = $3; next}
    {print substr($0, 1, 19), label, substr($0, 22 + length(label))}
' file
0 голосов
/ 13 июня 2018

Использование awk:

awk 'NF==3{n=$3;next}{for(i=NF;i>2;i--) $(i+1)=$i;$3=n}1' file | column -t

Сценарий awk получает имя, если строка содержит 3 элемента.Для всех остальных строк она сдвигает все элементы на одну позицию, за исключением первых 2. Наконец, строка печатается.

Команда column переформатирует для отображения в каждом столбце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...