Захват с упреждением AWK - PullRequest
0 голосов
/ 09 января 2020

Я заново редактирую для ясности - спасибо всем за их ввод.

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

Пример журнала -

20191127:20:22:40 023116-[INFO]:-Starting backup of database wan
20191127:20:22:40 023116-[DEBUG]:-Creating backup directories
20191127:20:22:40 023116-[DEBUG]:-Getting database size
20191127:20:22:40 023116-[INFO]:-Backup Timestamp = 20191127202240
20191127:20:22:42 023116-[DEBUG]:-Beginning cleanup
20191127:20:22:42 023116-[DEBUG]:-Cleanup complete
20191127:20:22:42 023116-[INFO]:-Backup completed successfully
20191127:21:22:40 023116-[INFO]:-Starting backup of database tew
20191127:21:22:40 023116-[DEBUG]:-Creating backup directories
20191127:21:22:40 023116-[DEBUG]:-Getting database size
20191127:21:22:40 023116-[INFO]:-Backup Timestamp = 20191127212240
20191127:21:22:42 023116-[DEBUG]:-Beginning cleanup
20191127:21:22:42 023116-[DEBUG]:-Cleanup complete
20191127:22:22:40 023116-[INFO]:-Starting backup of database tree
20191127:22:22:40 023116-[DEBUG]:-Creating backup directories
20191127:22:22:40 023116-[DEBUG]:-Getting database size
20191127:22:22:40 023116-[INFO]:-Backup Timestamp = 20191127222240
20191127:22:22:42 023116-[DEBUG]:-Beginning cleanup
20191127:22:22:42 023116-[DEBUG]:-Cleanup complete
20191127:22:22:42 023116-[INFO]:-Backup completed successfully

В одном файле может быть несколько прогонов - я не могу использовать дату / время, потому что есть вероятность, что каталог создание может удалить sh с отметки времени резервного копирования.

Чтобы еще больше усложнить шаблон, резервное копирование всегда будет подвергаться очистке, но не всегда будет успешным.

Я пытался использовать awk для выполнения этого -

Если я использую:

awk '/Timestamp/{ f=$5 }{ if ( f!="" ) print f,$0 }

Тогда я не только пропущу первые 3 строки, но и буду в итоге пометим первые 3 строки следующего задания неправильным штампом.

Я думал, что смогу использовать getline, но он потребляет строки - и это не совсем верно из-за порядка обработки. ..

Желаемый вывод - пометить все рабочие строки меткой времени

20191127202240 20191127:20:22:40 023116-[INFO]:-Starting backup of database wan
20191127202240 20191127:20:22:40 023116-[DEBUG]:-Creating backup directories
20191127202240 20191127:20:22:40 023116-[DEBUG]:-Getting database size
20191127202240 20191127:20:22:40 023116-[INFO]:-Backup Timestamp = 20191127202240
20191127202240 20191127:20:22:42 023116-[DEBUG]:-Beginning cleanup
20191127202240 20191127:20:22:42 023116-[DEBUG]:-Cleanup complete
20191127202240 20191127:20:22:42 023116-[INFO]:-Backup completed successfully
20191127212240 20191127:21:22:40 023116-[INFO]:-Starting backup of database tew
20191127212240 20191127:21:22:40 023116-[DEBUG]:-Creating backup directories
20191127212240 20191127:21:22:40 023116-[DEBUG]:-Getting database size
20191127212240 20191127:21:22:40 023116-[INFO]:-Backup Timestamp = 20191127212240
20191127212240 20191127:21:22:42 023116-[DEBUG]:-Beginning cleanup
20191127212240 20191127:21:22:42 023116-[DEBUG]:-Cleanup complete
20191127222240 20191127:22:22:40 023116-[INFO]:-Starting backup of database tree
20191127222240 20191127:22:22:40 023116-[DEBUG]:-Creating backup directories
20191127222240 20191127:22:22:40 023116-[DEBUG]:-Getting database size
20191127222240 20191127:22:22:40 023116-[INFO]:-Backup Timestamp = 20191127222240
20191127222240 20191127:22:22:42 023116-[DEBUG]:-Beginning cleanup
20191127222240 20191127:22:22:42 023116-[DEBUG]:-Cleanup complete
20191127222240 20191127:22:22:42 023116-[INFO]:-Backup completed successfully

Я предполагаю, что самый простой способ - это буферизовать строки и затем задним числом применить временную метку -

Что-то сродни -

{
  if ($0 ~ /Backup Timestamp/) { 
    timestamp = $NF; for (i=0; i<nb; i++) { 
      print timestamp,backup[i] 
     }; 
     nb=0; 
  }
  if (timestamp == "") { 
    backup[nb++] = $0 
  }
  else { 
    print timestamp,$0 
  }
}

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Насколько я понимаю, вы хотите пометить строки, которые представляют собой успешное резервное копирование. Согласно вашим утверждениям, они появляются в 4 последовательных строках, а последняя строка содержит метку времени.

Способ сделать это - отслеживать последние 4 записи в массиве с помощью оператора модуля (%). Это выглядит так:

awk '{a[FNR%4] = $0}' logfile

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

awk '{a[FNR%4] = $0}
     /Backup Timestamp/{
        tstamp=$NF
        for(i=1;i<=4;++i) print tstamp,a[(FNR+i)%4]
     }' logfile

, которая создает вывод "

20191127202240 20191127:20:22:40 023116-[INFO]:-Starting backup of database wan
20191127202240 20191127:20:22:40 023116-[DEBUG]:-Creating backup directories
20191127202240 20191127:20:22:40 023116-[DEBUG]:-Getting database size
20191127202240 20191127:20:22:40 023116-[INFO]:-Backup Timestamp = 20191127202240
20191127212240 20191127:21:22:40 023116-[INFO]:-Starting backup of database tew
20191127212240 20191127:21:22:40 023116-[DEBUG]:-Creating backup directories
20191127212240 20191127:21:22:40 023116-[DEBUG]:-Getting database size
20191127212240 20191127:21:22:40 023116-[INFO]:-Backup Timestamp = 20191127212240
1 голос
/ 09 января 2020

Я думаю, что ваш вопрос сводится к тому, сколько строк может предшествовать вашей метке времени, и сохраняет ли это количество строк в awk, хорошо? Вы можете хранить строки с чем-то вроде:

{
        if ($0 ~ /TimeStamp/) {
                f = $5;
                for (i=0; i < nb; i++) {
                        print f,backup[i]
                }
                nb=0;
        }
        if (f == "") {
                backup[nb++] = $0
        } else {
                print f,$0
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...