PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : blockarbeiten ...



TheDodger
30-11-2002, 07:15
Wie kann ich aus einer sehr, sehr großen Datei einen bestimmten Block "herausschneiden" ?

Ich benötige so ca. 10 Zeilen davon.

Den ca. Offset finde sich mittels 'cat -b <datei> | grep <suchstring>' ... allerdings benötige ich noch ein paar Dinge drumherum ...

Hans-Georg Normann
30-11-2002, 13:29
Ich würde bei der Aufgabenstellung den awk nehmen. Dann darf die Textdatei auch 100 MB oder größer sein.

Hans

TheDodger
30-11-2002, 13:42
Danke!

Aber mit awk habe ich dann nur 1% Erfahrung gegenüber meinen bash Kentnissen ...
Kannst du mir noch sagem, wie ich awk einsetzen müsste?

tomes
30-11-2002, 20:32
ein wenig mit Perl auseinander setzen willst, hier ein Ansatz -->
http://www.mrunix.de/forums/showthread.php?s=&threadid=30447
;)

T;o)Mes

Hans-Georg Normann
30-11-2002, 21:57
Das erst einmal für's erste Teil1: www.linux-magazin.de/Artikel/ausgabe/1996/10/AWK/awk.html (http://www.linux-magazin.de/Artikel/ausgabe/1996/10/AWK/awk.html)
Und Teil2 ist hier: www.linux-magazin.de/Artikel/ausgabe/1996/12/AWK/awk.html (http://www.linux-magazin.de/Artikel/ausgabe/1996/12/AWK/awk.html)

ich versuch mal ein Beispiel mit einer Log - Datei zu machen

Hans

Hans-Georg Normann
30-11-2002, 23:17
Ich habe fertig.......

Mußte erst gvim wieder auf Vordermann bringen, hat deshalb etwas länger gedauert.

Also ich habe meine procmail.log auseiander genommen. Dazu habe ich ein script procmail.awk geschrieben, welches folgenden Inhalt hat:
#mit BEGIN definierst du einen Block der beim Starten ausgeführt wird
#Der Block ist nicht zwingend notwendig
BEGIN {
print "starte das awk Script"
i = 0
}

# hier kommt jetzt ein Suchmuster ala grep und dann die darauf
# anzuwendenden Kommandos
/^procmail:\ Match on/ {
# $0 ist die komplette gefundene Zeile, $1 das erste Wort,
# $2 das zweite und so weiter
i +=1
if (index($0, "GMX delivery to h.g.normann@gmx.de") == 0) {
if (index($0, "procmail: Match on \"^FROM[ :].*@eBay.de\"") == 0) {
printf("%06d: %s\n", i, $0)
}
}

}

#es lönnen noch weiter Suchmuster folgen

#und hier wird das Script abgeschlossen
#ist aber nicht zwingend vorgeschrieben
END {
print "Beende das Programm"
print "\n\n\nSo das war's für's erste\n\n"
}

Das einleitende Suchmuster sucht alle in Procmail gefundenen Treffer. Die Darauffolgenden Scriptzeilen sollen alle Zeilen anzeigen die nicht über GMX Delivery ..... abgeschickt wurden und auch nicht von eBay.de versendet wurden. Der Aufruf erfolgt mit
awk -f procmail.awk procmail.logVersteht sich von selbst, dass die gezeigten Befehle bei weitem nicht alles sind, was awk wirklich zu leisten vermag.

Mit awk kann man rechnen, Dateien zum lesen und schreiben öffnen, Texte manipulieren, aber leider keine 1500 Euro Blüten drucken oder Kaffee kochen.

Ich hoffe das ist verständlich und auf deine Bedürfnisse übertragbar.

Viel Spass beim Knobeln
Hans

fork
01-12-2002, 03:37
Hier mal der Perlfetzen angepasst auf dein Problem
#!/usr/bin/perl
for(<>){
$gefunden=1 if(/Suchmuster/);
print $_."\n" if($gefunden and ++$zeile <= 10);}


Aufruf: ./this.pl eingabedatei.txt

Oder vielleicht reichen Dir die grep Optionen -A -B -##

Gruß
Tobias

TheDodger
01-12-2002, 07:24
Danke an alle!

meine bisherige Lösung sieht so aus:

s="`grep -A 8 <suchbebriff> <datei>`"
echo "$s"

...