Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Daten (RS232 Text-Stream) anhand dreier Zeilenenden filtern

  1. #1
    Registrierter Benutzer
    Registriert seit
    16.11.2005
    Beiträge
    11

    Daten (RS232 Text-Stream) anhand dreier Zeilenenden filtern

    Hallo

    Das nächste Bash-Problem:

    Ich schreibe Daten von der RS232 Schnittstelle mit - auf das sendende Gerät habe ich keinen Einfluss. Leider wird kein explizites Zeichen gesendet, um die Datensätze voneinander zu trennen, sondern eine Zeichenfolge
    Code:
    \n \n \n
    - wobei \n entsprechend für LF steht. Ich müsste also mindestens auf zwei Leerzeichen gefolgt von einem LF filtern können - und mit grep krieg ich das nicht hin.

    Any Hints?

    Edit: Was, wenn ich es filtern kann - eigentlich ist ja nur das Auftreten wichtig - müsste ich den lesenden Prozess (cat) töten, damit ich in eine neue Datei weiter aufzeichnen kann.
    Geändert von atomical (16-11-2005 um 19:13 Uhr)

  2. #2
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    Hi,

    ich kann das hier gerade nicht testen, aber evtl. kannst Du sowas mit einem Perlskript lösen...

    Wenn ich Dich richtig verstanden habe, hast Du einen Datenstrom, den Du in eine Datei umleitest. Du möchtest aber nach einer bestimmten Trennsequenz die Daten in eine neue Datei schreiben. Die Trennsequenz sind zwei aufeinanderfolgende Zeilen mit jeweils 2 Leerzeichen drin - richtig?

    Versuch mal folgendes Skript:

    PHP-Code:
    #!/usr/bin/perl

    use strict;
    use 
    warnings;

    my $AusgabeDateiPrefix "Ausgabe_";
    my $Index 0;
    my $Trennzeichen="  \n";
    my $Trennzaehler=0;

    while(<>)
    {
      if(
    $_ eq $Trennzeichen#Koennte Teil einer Trennsequenz sein
      
    {
        
    $Trennzaehler++;
      }

      if(
    $Trennzaehler == && $_ ne $Trennzeichen#War nicht Teil der Trennsequenz...
      
    {
        
    $Trennzaehler 0;
      }

      if(
    $Trennzaehler == 2# War eine Trennsequenz 
      
    {
        
    $Trennzaehler=0;
        
    $Index++;
      }

      if(
    $Trennzaehler == 0# Wenn Nutzdaten, dann wegschreiben...
      
    {
        
    open(FH,">>$AusgabeDateiPrefix".$Index);
        print 
    FH $_;
        
    close(FH);
      }



    Aufruf:
    Code:
    #> chmod 755 skript.pl
    #> cat /dev/rs232 | ./skript.pl
    sollte Dir den Datenstrom jetzt theoretisch in mehrere Dateien aufteilen ("Ausgabe_0", "Ausgabe_1", "Ausgabe_2",...)...
    Geändert von michael.sprick (16-11-2005 um 23:38 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    16.11.2005
    Beiträge
    11
    Tut es ...

    in
    Code:
    my $Trennzeichen=" \n";
    war ein SPACE zuviel - aber jetzt läufts

    Danke

  4. #4
    Registrierter Benutzer
    Registriert seit
    16.11.2005
    Beiträge
    11
    Hallo!

    Zwangsläufig muss die Trennung geändert werden - sie besteht jetzt aus einer Zeile von 65 mal "="

    dein Script hab ich versucht abzuändern - nur greift es nicht ...

    Code:
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $AusgabeDateiPrefix = "Ausgabe_";
    my $Index = 0;
    my $Trennzeichen="===";
    my $Trennzaehler=0;
    
    while(<>)
    {
      if($_ eq $Trennzeichen) #Koennte Teil einer Trennsequenz sein
      {
        $Trennzaehler++;
      }
    
      if($Trennzaehler == 1 && $_ ne $Trennzeichen) #War nicht Teil der Trennsequenz...
      {
        $Trennzaehler = 0;
      }
    
      if($Trennzaehler == 2) # War eine Trennsequenz
      {
        $Trennzaehler=0;
        $Index++;
      }
    
      if($Trennzaehler == 0) # Wenn Nutzdaten, dann wegschreiben...
      {
        open(FH,">>$AusgabeDateiPrefix".$Index);
        print FH $_;
        close(FH);
      }
    }
    Ich hab auch so ein bißchen rumgespielt - ich schaff es nicht, die Reihe "=" abzupassen ... die Ausgabedatei ist mit der Eingabedatei identisch.

    Im Anhang eine Testdatei
    Geändert von atomical (29-11-2005 um 23:21 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    ja - das geht dann nicht mehr, weil das Skript ja nach einer Trennsequenz von 3 gleichen Zeilen sucht.
    Man könnte jetzt die jeweiligen Zähler anpassen - es geht aber auch noch einfacher, wenn es sich nur noch um eine Zeile handelt.

    Die Variable $/ hilft hier weiter:


    PHP-Code:
    #!/usr/bin/perl

    use strict;
    use 
    warnings;

    my $AusgabeDateiPrefix "Ausgabe_";
    my $Trennzeichen       '=' x 65;
    my $Index              0;


    $/ = 
    $Trennzeichen;

    while(<>)
    {
      
    open(FH,">>$AusgabeDateiPrefix".$Index++);
      print 
    FH $_;
      
    close(FH);



    jetzt wird nicht mehr zeilenweise, sondern gleich blockweise gelesen...

    michael

  6. #6
    Registrierter Benutzer
    Registriert seit
    16.11.2005
    Beiträge
    11
    Funktionieren tut es wieder - versteh ich richtig, das $/ die Blockgrenze definiert und in der while-Schleife jeweils ein Block geschrieben und gleichzeitig der Index erhöht wird?

  7. #7
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    Ja - genau.
    Der Index wird ja durch $Index++ erhöht.
    Mehr zu $/ erfährst Du mit perldoc perlvar.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •