awk: Input line ... cannot be longer than 3,000 bytes.

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

awk: Input line ... cannot be longer than 3,000 bytes.

Beitrag von Duff » 02.03.2007 13:18:13

Hallo,

möchte folgendes mit awk realisieren:
Ich möchte aus einem Logfile mit

Code: Alles auswählen

 awk '/^<Anfang-Datum>/,/^<Ende-Datum>/' Logfile  > Ausschnitt_aus_logfile
nur einen Teil des Logfiles in einer neuen Datei speichern. Dass ganze funktioniert normalerweise auch.

Nur habe ich jetzt eine Datei, in der nicht so häufig ein Zeilenumbruch vorkommt und awk gibt mir dann folgende Fehlermeldung zurück:

Code: Alles auswählen

awk: Input line ... cannot be longer than 3,000 bytes.
 The input line number is 2. The file is Logfile.
 The source line number is 1.
Jemand nee Idee, wie man dieses Problem umgehen kann?
Oh, yeah!

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 02.03.2007 13:41:09

Hi,

auf anderen Unixen wird explizit zwischen nawk und oawk unterschieden, oft gibt es die GNU Variante noch zusätzlich. oawk ist meines wissens nach in der Zeilenlaenge recht eingeschraenkt (ich meine mich an 3000 zu erinnern), nawk kann da schon mehr. Auf Solaris, AIX und Co. ist awk gweoehnlich ein Link, wenn der dann halt auf oawk zeigt muss man nawk halt Vollqualifiziert aufrufen. Wie's bei dem GNU aussieht kann ich nicht sagen. Ich wuerde also entweder sehen, ob's eine awk Variante gibt die mehr kann als die von dir eingesetzt, oder zu Perl wechseln.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 02.03.2007 13:45:21

Danke,

aber scheint dort wohl nur ein awk zu geben.

Das Problem ist, dass ich das Bearbeiten bzw. das Ausschneiden eines bestimmten Bereichs auch dem Logfile recht schnell gehen soll und ich mir dafür nicht noch extra ein perl-Skript schreiben möchte.

Es sollte also schon ein Einzeiler sein!
Oh, yeah!

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 02.03.2007 14:33:12

Duff hat geschrieben:aber scheint dort wohl nur ein awk zu geben.
Das koennte man ja ggf. aendern, schau dir doch mal an was Synaptic und co. bieten. Wie gesagt, da ich auf Linux das Problem noch nie hatte, bin ich mir nicht mal sicher ob's hier genauso ist.
Duff hat geschrieben:Das Problem ist, dass ich das Bearbeiten bzw. das Ausschneiden eines bestimmten Bereichs auch dem Logfile recht schnell gehen soll und ich mir dafür nicht noch extra ein perl-Skript schreiben möchte.
Soll das Skript schnell erstellt werden, oder geht es um die Ausfuehrungszeit des Skriptes?
Duff hat geschrieben:Es sollte also schon ein Einzeiler sein!
Sowas gibt's auch bei Perl ;-}
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 02.03.2007 15:14:39

roli hat geschrieben: Soll das Skript schnell erstellt werden, oder geht es um die Ausfuehrungszeit des Skriptes?
...beides natürlich :roll: :wink: :lol:

Es sollte schnell erstellt werden, also wenn dann ein Einzeiler.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 02.03.2007 16:28:04

Duff hat geschrieben:
roli hat geschrieben: Soll das Skript schnell erstellt werden, oder geht es um die Ausfuehrungszeit des Skriptes?
...beides natürlich :roll: :wink: :lol:

Es sollte schnell erstellt werden, also wenn dann ein Einzeiler.
geht es auch um exakt das gleiche Ergebnis ?

der Perl-Oneliner ist auch nicht viel komplizierter und anscheinend sogar schneller:

Code: Alles auswählen

root@gms1:~# time perl -ne 'print if $_ ge "2007-02-20" && $_ le "2007-02-25"."\xFF"; ' /var/log/dpkg.log.1 >/dev/null

real    0m0.045s
user    0m0.012s
sys     0m0.008s
root@gms1:~# time awk '/^2007-02-20/,/^2007-02-25/' /var/log/dpkg.log.1 >/dev/null

real    0m0.097s
user    0m0.070s
sys     0m0.006s
Das Ergebnis ist allerdings nicht 100 prozentig gleich:
awk: sobald awk das Enddatum findet, gibt es diese Zeile noch aus und bricht ab, weitere Zeilen werden nicht mehr ausgegeben, auch wenn sie das gleiche Datum wie das Enddatum haben.
perl: wenn du das Script mit dem '."\xFF"' ausführst, werden alle Zeilen mit dem Enddatum ausgegeben, wenn du das '."\xFF"' wegläßt wird keine Zeile mit dem Enddatum ausgegeben

Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 02.03.2007 18:00:26

Danke für die Antwort und die Erklärung gms.

Aber der Perl-Einzeiler dauert ein wenig länger, aber eigentlich egal, weil hauptsache es funktioniert!

Was bedeutet denn diese spezial Variable \xFF?
Wo kann man so was nachschauen?
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 02.03.2007 18:41:05

Duff hat geschrieben:Was bedeutet denn diese spezial Variable \xFF?
entspricht einem Zeichen ( FF in hex = 255 decimal ) und entspricht daher dem "größten" Ansi-Zeichen

wenn die Ausgabe das Enddatum nicht mehr enthalten sollte, brauchst du das nicht:

Code: Alles auswählen

root@gms1:~# time perl -ne 'print if $_ ge "2007-02-20" && $_ le "2007-02-25"; ' /var/log/dpkg.log.1 >/dev/null

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 03.03.2007 16:28:37

Danke für die Erklärung.

Aber sollte die letzte gefunde Zeile mit dem Datum nicht sowieso mit angezeigt werden?
Es wird doch in perl folgendes benutzt:
[code
&& $_ le "2007-02-25"
[/code]

Und le bedeutet doch so viel wie less equal, also kleiner gleich...
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 03.03.2007 16:55:12

Duff hat geschrieben:Aber sollte die letzte gefunde Zeile mit dem Datum nicht sowieso mit angezeigt werden?
Es wird doch in perl folgendes benutzt:
[code
&& $_ le "2007-02-25"
[/code]

Und le bedeutet doch so viel wie less equal, also kleiner gleich...
auch wenn die erste Spalte der Zeile ( das Datum ) gleich ist, steht ja in der Zeile meistens noch weiterer Content, wodurch dann diese Bedingung nicht mehr erfüllt wäre

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 05.03.2007 09:20:13

Naja, so ganz logisch finde ich dass ganze noch immer nicht.


...aber das ist ja ne andere Sache...
Oh, yeah!

Antworten