Offset von regexp oder Tabs formatiert
Peter Mairhofer
- perl
Hallo!
Ich habe das Problem, dass ich eine Art ASCII Tabelle habe, wobei die Felder entweder durch Tabs oder durch Leerzeichen getrennt sind. Eine Spalte krieg ich nun über den Offset einer Zeile.
Das Problem ist jetzt aber, dass Tabs unterschiedlich groß sind (in der Annahme Std-Tab-Breite=8).
Gibt es di Möglichkeit, den Offset eines regexps zu finden? Dann wäre meine Idee so ähnlich:
$zeile =~ s/\t/&kette(" ", $offset % 8)/eg;
Jeden String einzeln durchgehen mittels substr scheint mir etwas zu overloaded. Oder?
Wie löst man das?
Vielen Dank!
Hallo!
Wie löst man das?
rolf erwin otto
rolf erwin otto
@names = split /\s+/, $line;
\s+ als Expr. für ein space oder mehr als ein space...
Gruss, Rolf
hi,
@names = split /\s+/, $line;
\s+ als Expr. für ein space oder mehr als ein space...
danke, aber das hilft mir leider nicht weiter. Kennst du die Logdateien, die mySQL produziert? Davon hab' ich so eine mit loglevel=hoch, sodass die Queries selbst mitgeloggt wurden. Und jetzt möchte ich die Queries extrahieren. Das ist ein großes Problem, weil sehr viele Queries über mehrere Zeilen gehen.
Wenn ich mir die Datei im Editor anschaue, dann ist sie schön "tabellarisch" aufgebaut:
Time Id Command Argument
(...)
Die Abstände sind aber manchmal aus Tabs und manchmal aus Leerzeichen.
Andre Vorschläge?
Danke!
hi,
Die Abstände sind aber manchmal aus Tabs und manchmal aus Leerzeichen.
\s+ match au tabs - scho gwisst?
Rolf
hi,
\s+ match au tabs - scho gwisst?
ja sicher. ich habs auch versucht aber es geht leider nicht. Ich druck einen Teil der Logfile ab, hoffentlich werden Tabs & Co richtig übernommen.
/usr/sbin/mysqld, Version: 3.23.49-log, started with:
Tcp port: 0 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
/usr/sbin/mysqld, Version: 3.23.49-log, started with:
Tcp port: 0 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
040509 17:53:23 1 Connect Access denied for user: 'debian-sys-maint@localhost' (Using password: YES)
040509 17:53:24 2 Connect Access denied for user: 'debian-sys-maint@localhost' (Using password: YES)
040509 17:53:25 3 Connect Access denied for user: 'debian-sys-maint@localhost' (Using password: YES)
040509 17:53:26 4 Connect Access denied for user: 'debian-sys-maint@localhost' (Using password: YES)
040509 17:53:27 5 Connect Access denied for user: 'debian-sys-maint@localhost' (Using password: YES)
040509 17:53:28 6 Connect Access denied for user: 'debian-sys-maint@localhost' (Using password: YES)
040509 17:53:36 7 Connect Access denied for user: 'root@localhost' (Using password: YES)
040509 17:53:52 8 Connect intranet@localhost on
040509 17:53:57 8 Init DB intranet
8 Query show databases
8 Query show tables
8 Field List phpbb_album
8 Field List phpbb_album_cat
8 Field List phpbb_album_comment
8 Field List phpbb_album_config
8 Field List phpbb_album_rate
040509 17:53:58 8 Field List phpbb_themes_name
8 Field List phpbb_topics
8 Field List phpbb_topics_watch
8 Field List phpbb_attach_quota
/usr/sbin/mysqld, Version: 3.23.49-log, started with:
Tcp port: 0 Unix socket: /var/tmp/mysql.sock
Time Id Command Argument
040509 18:00:50 1 Connect intranet@localhost on
1 Init DB intranet
1 Init DB intranet
1 Query REPLACE INTO t_online(SID, personID, time, ip) VALUES('24e294c416cf7de1ac6180c6c4600d22', -1, 1084118450, '192.168.200.123')
1 Query
SELECT
ts\_applet\_group
.appletID
AS id
,
ts\_applet\_group
.sideID
AS side
,
t\_applet
.path
AS path
FROM ts\_applet\_group
LEFT JOIN t\_applet
ON t\_applet
.appletID
= ts\_applet\_group
.appletID
LEFT JOIN th\_group
ON th\_group
.groupID
= ts\_applet\_group
.groupID
WHERE (t\_applet
.f\_aktiv
= 1) AND (0 OR th\_group
.short
= 'INT' )
GROUP BY id
ORDER BY ts\_applet\_group
.sortOrder
1 Query
SELECT
t_personen.nick
FROM
t_online
LEFT JOIN t_personen ON t_personen.personID = t_online.personID
WHERE
(1084118150 <= t_online.time)
1 Query SELECT (...)
Siehst du jetzt das Problem? Ich kann die Datei nicht vernünftig Zeile für Zeile durchgehen. Die Queries gehen oft über mehrere Zeilen. Ich muss eigentlich nur den Anfang und das Ende der Queries feststellen können (ich brauch nur INSERT, UPDATE und REPLACE).
Also war meine Idee eben, zu überprüfen, ob an einem bestimmten Offset "Query" steht. Von nun an wird alles ausgelesen, bis eine Zeile erscheint, an der ebenfalls an einem bestimmten Offset ein Befehl steht (hier muss es nicht mehr "Query" sein.
PS: Echt sauschlecht, die Logfile die mysql da erstellt hat...