Dateiverarbeitung in einem Shellscript

Hinweis: In dem Thema Dateiverarbeitung in einem Shellscript gibt es 9 Antworten. Der letzte Beitrag () befindet sich ganz unten auf dieser Seite.
  • Hallo zusammen, ?(
    bin kurz vor dem Verzweifeln. Habe mich in Foren und auch den Helps umgesehen, aber nichts gefunden, was mein Anliegen voranbringt.
    Im Verzeichnis /var/spool/ steht genau eine Datei. Den Dateinamen kenne ich nicht, hat aber die Anfangssyntax "KREP" gefolgt von weiteren unbekannten Zeichen.
    Die Datei hat eine unbekannte Anzahl Zeilen. Die Zeilen haben eine unbekannte Länge. Die Zeilen beginnen mit verschiedenen Buchstabensequenzen.
    Diese Datei möchte ich zeilenweise einlesen und dabei überprüfen, welche Buchstaben bis zum ersten Auftreten eines Semikolons stehen.
    Stehen bestimmte Schlüsselbuchstaben in dem Teil der Zeile, dann soll die gesamte Zeile in eine neue Datei geschrieben werden.


    Mit

    Bash
    DATEI=$(ls  /var/spool/KREP*)
    echo $DATEI

    bekomme ich nicht mal den Dateinamen allein, sondern den ganzen Pfad.
    Es ist zum Verzweifeln. ?(


    Vielen Dank
    Thomas

    Für den Inhalt des Beitrages 126649 haftet ausdrücklich der jeweilige Autor: Thomas220

  • Ihr Hausaufgabenspezialist empfiehlt:

    Bash
    awk -F';' '{print$1}' /var/spool/KREP*

    Und weil du ja nur sehr unbestimmt von bestimmten Zeichenfolgen schreibst, wirst du den Rest nicht zur Strafe, sondern nur zur Übung selbst basteln müssen.

  • Hallo zusammen,
    vielen Dank.
    Es ist keine Schulaufgabe. Auch wenn man nie auslernt.
    Getreu dem Sprichwort: Wenn du denkst es geht nicht mehr, kommt von irgendwo ein Licht daher, habe ich auf dieser Seite, nach meinen Beitrag, weiter gesucht und bin schließlich hier fündig geworden:
    sed
    Bis dahin wusste ich nicht einmal, was sed überhaupt ist. Ich habe zwar schon einige Codezeilen damit gesehen, aber was sie bedeuteten, habe ich nicht erkannt.
    Nachdem ich mich mit dem Tutorial beschäftigte, habe ich schließlich diese Codezeilen geschrieben und auf einmal waren alle Sorgen vergessen:

    Bash
    DATEI=$(ls -A /var/spool/ERS*)
    sed -n -e '/KREP/w /var/spool/KREP.csv' $DATEI

    Mit awk habe ich das auch probiert, habe aber kein richtiges Ergebnis erzielt.


    Dennoch vielen Dank für die Hilfsangebote.
    Sicher komme ich gerne wieder darauf zurück.


    Schönes WE


    Thomas

    Für den Inhalt des Beitrages 126702 haftet ausdrücklich der jeweilige Autor: Thomas220

  • Es ist sehr schlechter Stil, den formatierten Output von ls zu parsen.
    Gewöhn' dir das ab. Das ist fehlerträchtig und garantiert nicht portabel.


    Dein Problem wird korrekt (und portable -solange GNU- sed verwendet wird) so gelöst;
    sed -n -e '/KREP/w /var/spool/KREP.csv' /var/spool/ERS*


    Am Rande: Jetzt heißt die Eingabedatei plötzlich nicht mehr KREP<irgendwas>

  • Hallo Berichtigung, leider klappt das nicht so gut mit der E-Mail Benachrichtigung, deshalb antworte ich erst heute.
    Vielen Dank für die einfache Zeile, in der alles enthalten ist.
    Die Datei hat nun tatsächlich das Muster 'ERS*'. Allerdings gibt es da auch noch welche mit den Mustern 'KREP*', 'MPS*', 'MSG*' und 'HEADER*'.
    Aber in verschiedenen Verzeichnissen und da habe ich was durcheinander gebracht ;)


    Danke. Thomas

    Für den Inhalt des Beitrages 126839 haftet ausdrücklich der jeweilige Autor: Thomas220

  • Wenn Du nach einer/mehrerer Dateien suchst, solltest Du das nicht mit ls machen, sondern mit einem find Befehl.
    Find ist sehr mächtig, mit dem kannst du praktisch alles gezielt finden, parsen, verändern etc.


    Und als Ergebnis den gesamten Pfad zu haben ist so schlecht nicht. Musst halt den String dann auseinander schneiden um an den Dateinamen zu kommen.
    Da der das allerletzte Element in der oder den Zeilen dieser Rückgabe ist, kannst Du sowas drauf loslassen und hast den Dateinamen: ${i##*/}
    i steht hier als Variable im find der der Pfad samt Datei steht also sowas wie /var/spool/test.txt. die Ausgabe von ${i##*/} ist dann test.txt.
    Damit hast Du die Datei und kannst dann den sed drauf loslassen.


    Wenn find Dir mehrere Dateien ausspuckt, musst Du das halt in ein array einlesen und dieses dann Element für Element durchgehen (for oder while Schleife) und Deine Verarbeitungen darauf loslassen.

    Viele Grüße,
    T.

    Für den Inhalt des Beitrages 126842 haftet ausdrücklich der jeweilige Autor: Tamerlain

  • Hallo Tamerlain,
    vielen Dank für die Information.
    Derzeit brauche ich das so nicht. Aber das wird sich sicherlich mal ergeben und dann ist es gut zu wissen, dass es hier Hilfe gab.


    Viele Grüße
    Thomas

    Für den Inhalt des Beitrages 126974 haftet ausdrücklich der jeweilige Autor: Thomas220