Peter Mairhofer: Offset von regexp oder Tabs formatiert

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!

  1. 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

    1. 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!

      1. hi,

        Die Abstände sind aber manchmal aus Tabs und manchmal aus Leerzeichen.

        \s+ match au tabs - scho gwisst?

        Rolf

        1. 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.groupIDWHERE (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...