2012-04-13 16 views
0

Ich brauche Hilfe bei der String-Verarbeitung in CSH/TCSH-Skript. Ich kenne die grundlegende Verarbeitung, muss aber verstehen, wie wir die Anforderungen für den String-Betrieb handhaben können.Selektive String-Operation

Ich habe eine Log-Datei, deren Format ist so etwas wie folgt aus:

[START_A]

Protokoll Informationen von A

[END_A]

[START_B]

Loginfo von B

[END_B]

[START_C]

Protokoll Informationen von C

[END_C]

Meine Forderung ist selektiv Inhalt zwischen Start- und End-Tag zu extrahieren und sie in einer Datei . Zum Beispiel der Inhalt zwischen START_A und END_A wird in A.log gespeichert werden

Antwort

0

Awk sie 1 zu einem Zeitpunkt tun können:

cat log | awk '/[START_A]/,/[END_A]/' 
+0

Danke, es hat funktioniert. Ich mag Ihre Antwort, da es sehr einfach zu verstehen ist. – Ani

+0

[UUoC] (http://partmaps.org/era/unix/award.html#uucaletter) –

+0

Sie können wahrscheinlich machen dies alle Optionen auf einmal mit Regex statt nur die statischen Zeichenfolgen. – John3136

1

dies sollte für Sie arbeiten:

awk -F'_' '/\[START_.\]/{s=1;gsub(/]/,"",$2);f=$2".txt";next;}/\[END_.\]/{s=0} s{print $0 > f}' yourLog 

Test:

kent$ cat test 
    [START_A] 

    log info of A 

    [END_A] 

    [START_B] 

    log info of B 

    [END_B] 

    [START_C] 

    log info of C 

    [END_C] 


kent$ awk -F'_' '/\[START_.\]/{s=1;gsub(/]/,"",$2);f=$2".txt";next;}/\[END_.\]/{s=0} s{print $0 > f}' test 

kent$ head *.txt 
==> A.txt <== 

    log info of A 


==> B.txt <== 

    log info of B 


==> C.txt <== 

    log info of C 
+0

hey kent, Ich habe versucht, Ihr Beispiel zu laufen, und es lief, ohne einen Fehler zu geben, aber nicht erforderliche Dateien zu generieren. Dies könnte eine bessere Lösung gewesen sein, da ich eine Befehlszeile anstelle von mehreren Befehlen ausführen würde. Können Sie ein wenig erklären, wie der Befehl funktioniert. Ich kenne grundlegende awk, und würde das Konzept mit einer Erklärung greifen. Danke !! – Ani

+0

Dies funktioniert nur für Ein-Zeichen-Tags und für Single-Line-Log-Einträge, aber es könnte leicht geändert werden, um allgemeiner zu sein. +1 auf jeden Fall. –

0

Dies könnte funktionieren für Sie:

sed '/.*\[START_\([^]]*\)\].*/s||/\\[START_\1\\]/,/\\[END_\1\\]/w \1.log|p;d' file | 
sed -nf - file 
+0

Funktioniert nicht für mich. Können Sie ein kleines Konzept hinter Ihrem Befehl erklären? Ich hoffe zu erfahren, was Sie versuchen zu tun und hoffentlich sehen, ob ich etwas falsch mache. Dank – Ani

+0

Der erste Teil erstellt ein 'sed' Skript, das die Teile von' file' zwischen den Start- und Endtrennzeichen in eine Protokolldatei basierend auf dem Starttrennzeichen schreibt. Der zweite Teil (nach der Pipe) liest das erzeugte sed-Skript und führt es gegen die 'Datei'. Sie können den ersten Teil an eine Datei '> Datei senden.sed "und führe es dann wie folgt gegen die Datei aus:' sed -fn file.sed file'. – potong