2010-10-20 10 views
2

Je me donne un fichier journal (voir ci-dessous), je dois le faire à ce format en utilisant un script bash:script shell pour analyser le fichier journal

 

         
 
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

fichier journal

 

!!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  

Idées bienvenue .

Merci!

Répondre

2
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 
+0

Merci! Cela fonctionne très bien, sauf que vous avez sauté la date bmpspool qui a le même modèle que pdfspooldate. Comment les différencier? – myschyk

+0

vous pouvez définir un compteur. Voir mon édition – ghostdog74

+0

Comment analyser maintenant un fichier avec plusieurs parties de ce journal? Par, le chemin dans le compteur j'ai utilisé $ c = 2 et cela a fonctionné. – myschyk

2

Utiliser awk. Ecrire une machine d'état. Changez d'état lorsque vous voyez /^!!Begin$/, enregistrez vos données et videz votre sortie et revenez lorsque vous voyez /^!!End$/.

0

Si vous utilisez Perl/Python/Ruby, vous devriez pouvoir utiliser une correspondance d'expression régulière sur une ligne (la partie correspondante). Utilisez le mode multiligne dans lequel . correspondra au caractère de nouvelle ligne. Je pense que awk ou sed devrait être en mesure d'utiliser l'expression régulière de la même façon:

par exemple, en 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 

sortie:

$ 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 
+0

Comment lire le fichier texte et le passer à la variable "s" ici? get_file_as_text ne fonctionne pas – myschyk

0

j'utiliser Perl avec $/ = "!!End", puis analyser chaque paragraphe.

Questions connexes