сценарий оболочки для разбора файла журнала - PullRequest
2 голосов
/ 20 октября 2010

Мне выдан файл журнала (см. Ниже), мне нужно сделать его в этом формате, используя скрипт bash:

<blockquote>
title   pdfspool date  rip date   bmpspool date  CLAB date
Sometitle12  10/09/23 00:56:40 10/9/23 0:56:46  10/9/23 0:56:50  10/9/23 1:01:13
</blockquote>

файл журнала


!!Begin    
Source aserver:pdf_spool:the, Job 844b015e0043469e, Inst 844b015e0043469e    
Title Sometitle12.pdf    
Action Started Received, Ok Date 10/09/23 00:56:40    
For Administrator    
(8) DataType = PDF    
(17) Source = srv01:aserver:file_input:0    
!!End    
!!Begin    
Source aserver:rip:rip1, Job 844b015e0043469e, Inst 844b015e004346a0    
Title Sometitle12.pdf Cyan 1    
Action Started Transmit, Ok Date 10/09/23 00:56:46    
For Administrator    
(8) DataType = Bitmap    
(1) Destination = srv01:bserver:bmp_spool:the    
(4) Parent = 844b015e0043469e/844b015e0043469e    
!!End    
!!Begin    
Source bserver:bmp_spool:the, Job 844b015e0043469e, Inst 844b015e004346a0    
Title Sometitle12.pdf Cyan 1    
Action Started Received, Ok Date 10/09/23 00:56:50    
For Administrator    
(8) DataType = Bitmap    
(17) Source = srv01:aserver:rip:rip1    
!!End    
!!Begin    
Source bserver:bmp_spool:the, Job 844b015e0043469e, Inst 844b015e004346a0    
Title Sometitle12.pdf Cyan 1    
Action Atomic Accepted, Ok Date 10/09/23 01:01:13    
For Administrator    
(8) DataType = Bitmap    
(2) Source Queue = ^03Newspaper ltd(MP)^Date - 24MP^Site - N^    
(5) Requested By = clab    
(15) Approval Status = Waiting Approved    
 Changed from Waiting to Approved by clab.   
!!End    

Идеи приветствуются.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 20 октября 2010
awk 'BEGIN{}
/Action Started Received/ && !c{ pdfspooldate=$(NF-1)$NF ;c++}
/Action Started Received/ && c{ bmppooldate=$(NF-1)$NF ;c=0}
/Action Started Transmit/{ ripdate=$(NF-1)$NF }
/title/ { title=$2}
/Action Atomic Accepted/{ clabdate=$(NF-1)$NF }
END{ print title,pdfspooldate,ripdate,clabdate }' file
2 голосов
/ 20 октября 2010

Используйте awk. Напишите конечный автомат. Переключайтесь между состояниями, когда вы видите /^!!Begin$/, записывайте свои данные, выводите свои выходные данные и переключайтесь обратно, когда вы видите /^!!End$/.

0 голосов
/ 20 октября 2010

Я бы использовал Perl с $/ = "!!End", а затем проанализировал каждый абзац.

0 голосов
/ 20 октября 2010

Если вы используете Perl / Python / Ruby, вы должны иметь возможность использовать сопоставление регулярных выражений в одной строке (соответствующая часть).Используйте многострочный режим, где . будет соответствовать символу новой строки.Я думаю, что awk или sed должны иметь возможность использовать регулярные выражения таким же образом:

, например, в Ruby:

s = <<TEXT
!!Begin
Something haha
Title Good Bad Ugly
Date 1/1/2008
!!End
!!Begin
Other info
Title Iron Man
Date 2/2/2010
TEXT

result = s.scan(/^!!Begin.*?^Title\s+([^\n]*).*?^Date\s+([^\n]*)/m)

p result

result.each do |arr|
  puts arr.join(' ')
end

output:

$ ruby try.rb 
[["Good Bad Ugly", "1/1/2008"], ["Iron Man", "2/2/2010"]]
Good Bad Ugly 1/1/2008
Iron Man 2/2/2010
...