Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Bash-Script & sed

  1. #1
    Gast

    Post Bash-Script & sed

    hi,

    ich habe ein problem mit sed innerhalb eines bash-scripts. es geht um folgendes:
    in Result ist ein text mit mehreren zeilen, den moechte ich in die einzelnen zeilen zerlegen, wobei ich immer nur eine brauche und dann die naechste bearbeitet werden kann.
    bisher habe ich mir folgendes gedacht:

    while [ $Line -le $Zeilen ]
    do
    Row=$(echo "$Return" | sed -n ' $Line$p ' )
    while [ $Item -le 9 ]
    do
    Part=$(echo "Row" | awk ' { print $(($DOLLAR+'$Item')) } ' )
    done
    done

    dummerweise erwartet sed die kommandos in ' ', sodass $Line nicht ersetzt wird. gibt es auch eine andere loesung? bei awk funktioniert es aber :-(

    und wie sieht es mit awk aus? ich moechte jeweils die ersten 9 items bekommen - wieder in einer schleife.
    awk ' { print $(($DOLLAR+'$Item')) } '

    wie kann ich das einfacher machen?
    $Dollar ist $, $Item die Itemnummer

    thx,

    ChakZul

  2. #2
    Senior Mitglied
    Registriert seit
    24.08.1999
    Beiträge
    132

    Lightbulb

    Hi,

    zwar bin ich nicht ganz dahintergestiegen was du so vorhast, aber ich denke mal du willst die ersten neun Zeilen aussschneiden und eventuell diese noch weiter zerlegen. Hier mein Vorschlag:

    Code:
    #!/bin/bash
    # for-schleife: Verarbeitung der Zeichenketten "1"-"9"
    for LINE in 1 2 3 4 5 6 7 8 9
        do
        TEXT=$(head -$LINE textfile | tail -1) # erst mit >>head<< die in $LINE
                                               # angegebene Anzahl Zeilen ab Datei-
                                               # anfang ausschneiden und mit
                                               # >>tail -1<< wiederum die letzte
                                               # davon
     
        set $TEXT                              # Die einzelnen Woerter in einer
                                               # Zeile als Parameter $1-$9 an-
                                               # sprechbar machen
     
        eval echo \$$LINE                      # Eine Paramerabhaengige Verarbei-
                                               # tung andeuten
        done

  3. #3
    Gast

    Thumbs up

    hi,

    danke fuer die schnelle antwort. ich werde deinen vorschlag mal ausprobieren.
    ich habe immer eine variable anzahl von zeilen, das bekomme ich aber mit wc -l gebacken. die einzelnen elemente der zeile sollen dann weiterverarbeitet werden, wie du es ja "entschluesselt" hast.

    dummerweise will ich die ausgabe eines programs weiterverarbeiten, die so eine art tabellenform hat. allerdings sind da keine definierten trennzeichen drin und die felder haben keine definierte breite o.ä.. ausserdem koennen auch leere felder vorkommen. etwa so:

    Name Vorname Geburtsdatum Wohnort Telefon
    Bayer Heinz Uli ........... Bonn 123456

    (Punkte sollen leerzeichen entsprechen)
    mit dem, was ich bisher zusammengebracht habe und du mir vorgeschlagen hast, ist das filtern der einzelnen eintraege wohl nicht moeglich, oder? ich denke so langsam auch, dass sich das nicht fuer eine automatisierung eignet.
    na ja, wenn sich die ausgabe mal nicht an die haeufigste formatierung haelt, dann stehen nacher die eintraege einer zeile eben in der falschen kategorie, aber sie sind noch da.

    thx,

    ChakZul

    [Dieser Beitrag wurde von ChakZul am 16. Dezember 2000 editiert.]

  4. #4
    Senior Mitglied
    Registriert seit
    24.08.1999
    Beiträge
    132

    Post

    Hi,

    Wenn du keine Feldtrenner hast, kannst du's nur noch mit festen Feldlaengen versuchen, und das ganze dann mit >>cut -c<< extrahieren.

    MfG Tobias

  5. #5
    Gast

    Post

    hi,

    ích bins nochmal...
    hab folgendes gemacht:
    <code><pre>
    # alle zeilen durchgehen, jeweils eine in Row schreiben
    while [ $RCount -le $Zeilen ]
    do
    Row=$( echo $Return | head -$RCount | tail -1)
    set $Row
    echo $Row
    # einzelne teile aus Row herausholen
    for Count in 1 2 3 4 5 6 7 8 9
    do
    Part=$(eval echo \$$Count)
    echo $Part
    done
    done

    </pre>
    </code>

    tja, nur gibt echo $Part immer nur die entsprechenden Teile der *ersten* Zeile aus.
    echo $Row hat die richtigen Eintraege.

    Wie kann ich mit set fuer jede neue Zeile die $Part wieder in $1 bis $9 ablegen?

    thx,

    ChakZul



    [Dieser Beitrag wurde von ChakZul am 21. Dezember 2000 editiert.]

    [Dieser Beitrag wurde von ChakZul am 21. Dezember 2000 editiert.]

    [Dieser Beitrag wurde von ChakZul am 21. Dezember 2000 editiert.]

    [Dieser Beitrag wurde von ChakZul am 21. Dezember 2000 editiert.]

  6. #6
    Registrierter Benutzer
    Registriert seit
    20.10.1999
    Ort
    Dresden
    Beiträge
    255

    Post

    Ich weiß zwar nicht genau, was Du mit den Werten anstellen willst, aber awk scheint mir die elegantere Lösung zu sein:

    <pre>
    echo $result | awk '{ for (i=1; i<= NF; i++) print "Zeile " NFR " " i ". Feld ist " $i}'
    </pre>

    Arbeitsweise:

    Mit "echo $result" wird awk gespeist. Da awk zeilenweise arbeitet, ist eine Schleife über die Zeile hinfällig.

    Awk läuft im Beispiel vom ersten Feld $1 bis zum letzten Feld $(NF) und gibt jedes Feld mit der Zeile, in der es steht, seiner Nummer und dem Inhalt aus.

    Thomas

  7. #7
    Gast

    Post

    hi,

    ok, vielleicht wirds klarer wenn ich sage, worum es mir geht. vielleicht hat auch jemand eine viel elegantere loesung als ich sie hier anfangs gepostet habe.

    ich moechte immer mal wieder abfragen, wer auf meinem rechner gerade eingeloggt ist. dazu benutze ich finger. das problem daran ist, dass dessen ausgaben keine feldtrenner haben und manche zellen nicht besetzt sind.
    kann man ja evtl. noch mit diversen abfragen umgehen, wenn ein doppelpunkt drin ist, dann ist es entweder device oder uhrzeit usw.

    mir geht es jetzt darum, die einzelnen Items in eine tabelle zu schreiben. dazu muss ich die einzelnen zeilen in login, name, uhrzeit etc aufspalten.

    thommy:
    danke, das hilft mir. ich hatte schon mit awk experimentiert, dort aber nur die spalten mit x zeilen bekommen. da kannte ich die methode mit head & tail noch nicht und habs aufgegeben und hier gepostet.

    da faellt mir ein, who scheint eine gute ausgabe zu haben. ich glaube, ich benutze who und hole dann mit finger den vollen namen und evtl die remote-adresse. ist glaube ich wesentlich einfacher.

    ein eigenes finger etc zu schreiben oder das userfile direkt auszulesen ist nicht moeglich, da es evtl noch auf anderen rechnern eingesetzt werden soll, die keinen zugriff darauf haben.

    danke fuer eure hilfe,

    ChakZul

  8. #8
    Senior Mitglied
    Registriert seit
    24.08.1999
    Beiträge
    132

    Post

    Dokumentationsfundstellen:

    awk:
    <A HREF="http://baracke.rus.uni-stuttgart.de/%7Erushobel/minikurs/awk/">http://baracke.rus.uni-stuttgart.de/%7Erushobel/minikurs/awk/</A>

    Shell-Programmierung:
    <A HREF="http://www.linuxinfo.de/de/doku/script1/konz-bed/Linux.html">http://www.linuxinfo.de/de/doku/script1/konz-bed/Linux.html</A>

    SED:
    <A HREF=http://www.linuxfibel.de/linux/linuxfibel/sed.htm>http://www.linuxfibel.de/linux/linuxfibel/sed.htm</A> SORRY war falsch geschrieben, geht selbstverständlich!!!

    mfg Tobias



    [Dieser Beitrag wurde von mightymike99 am 04. Januar 2001 editiert.]

  9. #9
    Registrierter Benutzer
    Registriert seit
    20.10.1999
    Ort
    Dresden
    Beiträge
    255

    Post

    Anmerkungen zum Link der Linuxfibel...

    Alle Dateien enden auf *.htm (nicht *.html ), das Stammverzeichnis ist http://www.linuxfibel.de/linux/linuxfibel bzw. http://www.saxsys.de/linux/linuxfibel bzw. http://www.termer.de/linuxfibel

    Grüße
    Thomas

Lesezeichen

Berechtigungen

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