Обработка журналов блок за блоком, каждый блок которого состоит из нескольких строк - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь собрать все системные статистические данные при выполнении некоторых фоновых заданий. Например, я использую следующую команду для сбора статистики ввода-вывода:

iostat -xty 5

Этот скрипт используется для сбора статистики ввода-вывода каждые 5 секунд. Так что мой журнал будет содержать много блоков данных. Вот пример журнала, который я получаю 2 блока:

Linux 3.10.0-957.21.3.el7.x86_64 (dp-sim-rockdb-1)      07/09/19        _x86_64_        (8 CPU)

07/09/19 17:37:21
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          75.97    0.00   21.65    0.00    0.00    2.38

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00    1.00     0.00     4.00     8.00     0.00    1.00    0.00    1.00   1.00   0.10
sdb               0.00     7.00   27.00   39.00   108.00  7676.00   235.88     0.47    7.14    2.07   10.64   0.56   3.70

Linux 3.10.0-957.21.3.el7.x86_64 (dp-sim-rockdb-1)      07/09/19        _x86_64_        (8 CPU)

07/09/19 17:37:26
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          73.78    0.00   23.97    0.12    0.00    2.12

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00   11.00    1.00   328.00     4.00    55.33     0.56   50.17   54.64    1.00   8.67  10.40
sdb               0.00    10.00    0.00   42.00     0.00  9920.00   472.38     0.34    8.05    0.00    8.05   0.33   1.40

Я часто использую awk для синтаксического анализа журналов и переформатирования, а затем для их построения. Для каждого блока я хочу получить строку DateTime и поле wkB / s, а затем объединить в одну строку:

07/09/19 17:37:21,7676.00
07/09/19 17:37:26,9920.00
...

Трудно при использовании awk: команда awk обрабатывает каждую строку журнала. Но в моем примере мне нужно распознать блок. И затем в этом блоке мне нужно несколько данных из нескольких строк, а затем объединить в 1 строку.

Пожалуйста, подскажите мне идею сделать это.

1 Ответ

1 голос
/ 11 июля 2019

Ищите строки, которые являются уникальными в каждом блоке.
С выводом, как показано в вашем примере, должно работать следующее:

iostat -xty 5 |
   awk '/^[0-9]{2}\/[0-9]{2}\/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$/ {t=$0}
        /^sdb/ { print t "," $7}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...