2010-09-24 7 views
2

J'ai un simple fichier journal qui est très salissant et j'ai besoin qu'il soit soigné. Le fichier contient des en-têtes de journaux, mais ils sont tous mélangés, donc je dois trier les fichiers journaux en fonction des en-têtes de journaux. Il n'y a pas de nombre de lignes statiques, ce qui signifie qu'il n'y a pas de nombre fixe de lignes pour chaque en-tête du fichier texte. Et j'utilise AWK pour trier les en-têtes.Comment Awk Paragraphe dans un fichier texte complexe?

Les fichiers journaux ressemble à ceci:

Car LogFile Header 
<text> 
<text> 
<text> 
Car LogFile Header 
<text> 
Car LogFile Header 
<and so forth> 

Il serait émis en sortie comme ceci:

Car LogFile Header 
<text> 
<text> 
<text> 
------------------- 
Car Logfile Header 
<text> 
<text> 

Je l'ai fait jusqu'à/rechercher un code simple, mais il ne semble pas fonctionner . Quelqu'un peut-il me guider s'il vous plaît? Merci!

#!/bin/bash 

# usage: pargrep <infile> <searchpattern> 

inFile="$1" 
searchString="$2" 

awk ' 
BEGIN { 
    FS="\n" 
    RS="-----" 
} 
/'"$searchString"'/ { print } 
' ${inFile} 
+0

"ça ne semble pas fonctionner" n'est pas très instructif. En quoi son comportement diffère-t-il de ce que vous attendez et quels messages d'erreur recevez-vous? –

+0

Il donne une erreur de "awk: cmd., Ligne: 6: //root/Desktop/Default.log/ {print} awk: cmd., Ligne: 6:^erreur de syntaxe awk: cmd., Ligne: 6://root/Desktop/Default.log/ {print} awk: cmd line: 6:^une expression rationnelle non terminée " – JavaNoob

+0

ce serait bien si vous pouviez nous échantillonner l'entrée et la sortie attendue. Merci – dogbane

Répondre

2

Il est préférable d'utiliser le passage de variable au lieu d'essayer d'obtenir une citation complexe.

#!/bin/bash 

# usage: pargrep <infile> <searchpattern> 

inFile="$1" 
searchString="$2" 

awk -v selector=$searchString ' 
    BEGIN { 
     FS="\n" 
     RS="-----" 
    } 
    selector ~ $0 { print } 
    ' "${inFile}" 
+0

Maintenant, il me donne l'erreur de " awk: cmd line: 3: fatal: impossible d'ouvrir le fichier 'pargrep 'pour la lecture (pas de fichier ou de répertoire)" ..... Des pensées dans ça? Ce problème est-il dû à l'appel d'utilisation supplémentaire? – JavaNoob

+0

@JavaNoob: Cela me semble être un guillemet manquant. –

+0

Il ne fonctionne toujours pas .... – JavaNoob

2

réponse de Tordre Dennis un peu:

awk -v selector="$searchString" ' 
    BEGIN { 
     RS = "Car LogFile Header\n" 
     ORS = "------" 
    } 
    selector ~ $0 { 
     print RS $0 
    } 
' "${inFile}" 

Notez que RS est le séparateur d'enregistrement d'entrée . J'ai utilisé ORS pour illustrer. Je suppose que "Car LogFile Header" est constant. Si c'est dynamique, faites le nous savoir.

Questions connexes