1.Zeile aus einer Datei auslesen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Mattze63, 09.10.2008.

  1. #1 Mattze63, 09.10.2008
    Mattze63

    Mattze63 Grünschnabel

    Dabei seit:
    09.10.2008
    Beiträge:
    1
    Zustimmungen:
    0
    Hallo und guten Tag an alle,

    ich habe ein Problem, das ich mit meinen sehr minimalen und noch dazu stark veralteten Kenntnissen der Shellprogrammierung nicht lösen kann.
    Ich muß zur Fallunterscheidung in eine Eingangsdatei schauen, in dieser muß ich dann die ersten drei Zeichen der ersten Zeile auslesen um sie mit einer vorgegebenen Zeichenfolge zu vergleichen.
    Bei positivem Match soll eine bestimmte Aktion ausgeführt werden.

    Das ganze soll auf einem HP Unix funktionieren.
    Ich habe schon geraume Zeit in den Forenbeiträgen gesucht, aber leider nichts gefunden.

    Vielleicht kann mir ja jemand helfen.

    Besten Dank vorab und Grüße

    Matthias
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 slackfan, 09.10.2008
    slackfan

    slackfan König

    Dabei seit:
    18.04.2006
    Beiträge:
    809
    Zustimmungen:
    0
    Ort:
    Bonn
    Vielleicht

    Code:
    #!/bin/bash
    if [ `dd if=datei bs=1 count=3` = "abc" ]; then
        echo "1"
    else
        echo "2"
    fi
     
  4. #3 marcellus, 09.10.2008
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Mit dd ist das aber schon sehr barbarisch, wie wärs mit "head -c 3"?
     
  5. #4 Gott_in_schwarz, 09.10.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Code:
    $ echo $'test\n123'|
    $ perl -ne 'exit(/^abc/ ? 0 : 1)' && echo 'yay' || echo 'nej'
    nej
    $ echo $'abc\nfoo'|
    $ perl -ne 'exit(/^abc/ ? 0 : 1)' && echo 'yay' || echo 'nej'
    yay
    Hat man gleich auch ne gute RE-Engine zur Hand und muss sich nicht mit sed-Pipes, command-Substitutions oder gar bash-Pattern-Matching rumschlagen.
    I've got a fever and the only prescription is moar perl!
     
  6. #5 slackfan, 09.10.2008
    slackfan

    slackfan König

    Dabei seit:
    18.04.2006
    Beiträge:
    809
    Zustimmungen:
    0
    Ort:
    Bonn
    Ist aber bestimmt nicht so schnell?!
     
  7. #6 Gott_in_schwarz, 09.10.2008
    Zuletzt bearbeitet: 09.10.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Code:
    $ cat test
    abcfoo
    $ time for i in {1..1000}; do [ "$(head -c3 test|grep -o '^abc')" ]; done
    
    real    0m15.162s
    user    0m6.126s
    sys     0m8.202s
    $ time for i in {1..1000}; do perl -ne 'exit(/^abc/ ? 0 : 1)' test; done
    
    real    0m9.516s
    user    0m4.187s
    sys     0m4.675s
    Da dd nix von charsets weiß, vernachlässige ich das hier einfach mal...
    Und ne schnellere Lösung mit head ist mir auch nicht eingefallen.
    edit:
    Mit ohne regex (und extra grep-pipe) gehts fixer:
    Code:
    $ time for i in {1..1000}; do [ x"$(head -c3 test)" = x"abc" ]; done
    
    real    0m6.444s
    user    0m2.810s
    sys     0m3.305s
    Aber halt nur string-Vergleich, wobei, bash-Patternmatch geht wohl auch fixer:
    Code:
    $ time for i in {1..1000}; do [[ x"$(head -c3 test)" =~ ^xabc ]]; done
    
    real    0m6.846s
    user    0m2.723s
    sys     0m3.377s
    Aber wegen diesen paar Sekunden sich gegen die durch perl gewährleistete Portabilität zu entscheiden, naja, nicht mein Bier. :)
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  9. #7 slackfan, 09.10.2008
    Zuletzt bearbeitet: 09.10.2008
    slackfan

    slackfan König

    Dabei seit:
    18.04.2006
    Beiträge:
    809
    Zustimmungen:
    0
    Ort:
    Bonn
    Okay,

    das hätte ich jetzt wirklich nicht gedacht. Man lernt nie aus!

    Code:
    ~$: cat head.sh 
    
    FORTUNE="Chuck Norris hat in seinem Leben zweimal gebadet - So entstanden das Rote- und das Tote Meer."
    
    time for ((i=0; i<=1000; i++)); do head -c5 $FORTUNE 2> /dev/null > /dev/null; done
    
    time for ((i=0; i<=1000; i++)); do dd if=$FORTUNE of=/dev/null bs=1 count=5 2> /dev/null > /dev/null; done
    
    time for ((i=0; i<=1000; i++)); do echo $FORTUNE > perl -ne "exit(/^abcde/ ? 0 : 1)" 2> /dev/null > /dev/null; done
    
    ~$: ./head.sh 
    
    real	0m2.282s
    user	0m0.677s
    sys	0m1.614s
    
    real	0m2.393s
    user	0m0.682s
    sys	0m1.690s
    
    real	0m0.250s
    user	0m0.163s
    sys	0m0.086s
     
  10. #8 Gott_in_schwarz, 09.10.2008
    Zuletzt bearbeitet: 09.10.2008
    Gott_in_schwarz

    Gott_in_schwarz ar0

    Dabei seit:
    22.04.2007
    Beiträge:
    546
    Zustimmungen:
    0
    Ort:
    Niedersachsen
    Hehe, muss auch wenn überhaupt:
    Code:
    time for ((i=0; i<=1000; i++)); do perl -ne "exit(/^abcde/ ? 0 : 1)" $FORTUNE 2> /dev/null > /dev/null; done
    heißen¹, weil du sonst nur ein echo-Kommando hast. Dann ist es (bei mir zumindest) auch langsamer als head und dd, was ja auch verständlich ist.. (Aber bei head und dd hörts ja nicht auf, man muss ja den output irgendwie weiterverarbeiten in einem neunen Prozess.)
    Warum zum Beispiel meine gepostete head-grep-pipe Lösung so miserabel abschneidet ist recht simpel: es werden sehr viele Prozesse gespawnt.
    Code:
    [ "$(head -c3 test|grep -o '^abc')" ]
    Ein Prozess für test ([), einer für head und einer für grep. Und dann werden command-Substitutions und pipes in subshells ausgeführt, also nochmal zwei extra Bash-Instanzen. Wenn ich mich nicht verzählt hab wären das dann laut Eva Zwerg fünf Prozesse gegen einen (perl). Da gut abzuschneiden ist ja fast schon schummeln. Aber naja.
    edit: test ist ja built-in und nicht mehr ein extra Prozess wie früher, ganz vergessen. Aber immernoch 4 vs. 1.


    Man kann das ganze übrigens noch mystischer schreiben:
    Code:
    perl -ne 'exit !/^abc/'
    shell true und false Werte (exit-Values) sind ja quasi vertauscht im Gegensatz zu "richtigen Sprachen".

    edit:
    ad 1: so muss es auch nicht heißen, hab mir mal deine head.sh angeschaut...
    Sagen wirs mal so: wer stdout und stderr jeweils einen fetten /dev/null-Knebel reinprügelt muss sich nicht über ausbleibende Schreie bei der Vergewaltigung diverser Prozesse wundern.
     
Thema:

1.Zeile aus einer Datei auslesen

Die Seite wird geladen...

1.Zeile aus einer Datei auslesen - Ähnliche Themen

  1. Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen

    Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen: Hallo, ich habe ein Verzeichnis, darin enthalten sind mehrere Dateien. Nun möchte ich alle Dateien (Parameter $1) gegen eine konstante Datei...
  2. 2 Zeilen aus einer txt auslesen

    2 Zeilen aus einer txt auslesen: Hallo Leute, ich habe eine Datei die immer aus zwei zusammenhängenden Zeilen besteht, als Beispiel: DE0006231004 # 15,04 Infineon DE0005785604...
  3. Shell-Skript Datum in einer Datai suchen

    Shell-Skript Datum in einer Datai suchen: Hallo zusammen Ich komm eigentlich aus der Klicki-Bunti-Welt von Windows. Seit geraumer Zeit versuche ich meine Künste mit verschiedenen...
  4. Timestamp an Inhalt einer Textdatei anfügen

    Timestamp an Inhalt einer Textdatei anfügen: Hallo, ich als neuer, unerfahrener Nutzer von Linux und der bash hätte folgende Frage. Und zwar würde ich gerne mit einem command den Zeitstempel...
  5. VoCore: Kleiner Open-Source-Platinenrechner mit OpenWrt

    VoCore: Kleiner Open-Source-Platinenrechner mit OpenWrt: VoCore ist Open Source, was Hard- und Software betrifft, kostet 20 US-Dollar und setzt beim Basteln eine Stufe tiefer an als der Raspberry Pi....