Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Ausgabe vom Script - Zeilenweise verarbeiten

  1. #1
    Registrierter Benutzer Avatar von sam600
    Registriert seit
    Sep 2007
    Beiträge
    340

    Ausgabe vom Script - Zeilenweise verarbeiten

    Hallo

    gibt es einen einfacheren weg:

    Code:
    befehl > dateiliste.lst
    
    for z in $(cat dateiliste.lst)
    do
    ...
    done
    d.h.: wie kann ich die ausgabe gleich zeilenweise verarbeiten lassen ( ohne for schleife )

    befehl | ausgabe_wird_zeileneweise_abegearbeitet mit der ausgabe

    z.b.:
    ls -l | befehl option=<ausgabe>

    danke

  2. #2
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.046
    das kommt ein wenig darauf an, was in "..." passiert.

    Du könntest aber auf jeden Fall den Umweg über die Datei weglassen und in der for-Schleife direkt den Befehl eintragen...
    Ich bin root - ich darf das.

  3. #3
    Registrierter Benutzer
    Registriert seit
    Jun 2002
    Ort
    Darmstadt
    Beiträge
    171
    Da Du offenbar eine Liste von Dateien verarbeiten willst, würde ich als erstes in Richtung find ... -exec ... denken
    Code:
    # Suche alle Dateien in /home/ich (und dessen Unterverzeichnissen), 
    # die als Benutzer 'ich' haben und in deren Namen 'blah' vorkommt
    find /home/ich -user 'ich' -iname '*blah*'
    # tue etwas mit den gefundenen Dateien, z. B. verschiebe sie nach /somedir
    find /home/ich -user 'ich' -iname '*blah*' -exec mv {} /somedir \;
    Du kannst also als Wert für die Option -exec einen beliebigen Befehl übergeben, in den anstelle von {} die jeweils gefundene Datei eingesetzt wird. Abgeschlossen wird der Befehl mit \; . find beherrscht noch einen ganzen Schwung weitere Tests, z. B. ob es sich um eine normale Datei (oder ein Verzeichnis oder eine Gerätedatei oder ...) handelt, wann eine Datei zum letzten Mal geändert wurde usw. Die man page von find oder das allwissende Google wissen genaueres

    Speziell wenn Du mit sehr vielen Fundstellen rechnest, kann xargs die bessere Möglichkeit sein. Mit xargs stellst Du Kommandozeilen mit mehreren bis vielen Argumenten zusammen. Wenn Du also beispielsweise mit
    Code:
    ls *.txt
    die Textdateien t1.txt, t2.txt und t3.txt anzeigen lassen kannst, entspricht
    Code:
    ls *.txt | xargs mv {} /somedir
    einem Aufruf von
    Code:
    mv t1.txt t2.txt t3.txt /somedir
    Bei sehr vielen Argumenten kann xargs deshalb besser sein als find -exec, weil letzteres für jede Datei einen eigenen Prozess startet. Das heißt, in obigem Beispiel würde find -exec die drei gefundenen Textdateien mit drei getrennten mv-Befehlen verschieben. Wenn Du nicht nur drei, sondern vielleicht drei Millionen Dateien behandeln willst, könnte das den Rechner ins Schwitzen bringen xargs macht einen einzigen Befehl daraus. Dessen Länge ist natürlich auch irgendwo begrenzt, und nicht jeder Befehl kann mit beliebig vielen Argumenten umgehen. Außerdem trennt xargs seine Argumente mit Leerzeichen. Das bedeutet, wenn Du beispielsweise den Dateinamen "meine datei.txt" an xargs verfütterst, gerät er ins Stolpern, weil er das als zwei Dateien "meine" und "datei.txt" interpretiert. Es gibt Wege, das zu umgehen, aber das würde hier zu weit führen.

    Der Vollständigkeit halber sei noch sed erwähnt, auch wenn es in Deinem Fall nicht der beste Ansatz sein dürfte. sed ist ein "streaming editor", mit dem Du Dateien zeilenweise verarbeiten kannst. Beispielsweise kannst Du damit Zeilen herausfiltern, die ein bestimmtes Muster aufweisen, oder Ersetzungen vornehmen, oder ... Die Arbeit mit sed ist nicht in drei Sätzen erklärt, aber auch hier findet Google im Zweifel genügend Tutorials und andere Infoquellen

    Bis dann,

    scribble

  4. #4
    Who's Johnny? Avatar von L00NIX
    Registriert seit
    Mar 2004
    Beiträge
    1.229
    Zitat Zitat von sam600 Beitrag anzeigen
    Hallo

    gibt es einen einfacheren weg:

    ...
    Nicht einfacher, aber flexibler und wirklich zeilenweise:

    Code:
    befehl | while read line ; do
    ... "$line"
    done
    Denn deine for-Schleife hat "Probleme" mit Leerzeichen, Tabs etc. Mit while klappt's zeilenweise. Wichig hierbei ist das quoting, also die doppelten Hochkomma um die Variable $line bei jeder Verwendeung.

    Gruß
    L00NIX

Ähnliche Themen

  1. shell script. datei zeilenweise auslesen usw.
    Von boesi666 im Forum Linux Allgemein
    Antworten: 13
    Letzter Beitrag: 28.05.09, 22:41
  2. add machine script unter samba opensuse 11
    Von gnoovy im Forum Linux als Server
    Antworten: 4
    Letzter Beitrag: 02.09.08, 00:05
  3. Athlon idle Script
    Von steve-e im Forum Anwendungen Allgemein, Software
    Antworten: 2
    Letzter Beitrag: 05.05.04, 18:16
  4. Antworten: 2
    Letzter Beitrag: 21.05.03, 16:30
  5. Numlock per Script aktivieren...
    Von neXes im Forum System installieren und konfigurieren
    Antworten: 4
    Letzter Beitrag: 14.05.03, 20:02

Lesezeichen

Berechtigungen

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