Bash: Grep und AWK nutzen

Hallo Zusammen,

In einer Bash Umgebung möchte ich gern auf Kommandozeile folgendes umsetzen:

  1. In ein bestimmtes Verzeichnis wechseln
  2. Mittels Grep Befehl einen Dateinamen finden
  3. Mit dem Dateinamen und dem cp Befehl die Datei verschieben

Das alles kann ich einzeln, würde es nun aber gern miteinander verbinden, also in einer Zeile haben, sodass auch ein unbedarfter User oder ein automatisches Programm diese eine Zeile ausführen kann.

Bisher sah das z.b. folgendermassen aus

cd Orderpfad

grep  suchstring *Datum*            (*Datum* = Teil des Dateinamens ist immer das Datum YYYYMMDD)

Der Rückgabewert von grep ist dann unter anderem der volle Dateiname (Der Rückgabewert beginnt mit dem Dateinamen, getrennt durch einen : (Doppelpunkt), danach kommt der Dateiinhalt)

Ich kopiere mir dann manuell den Dateinamen, dann kommt cp Dateiname NeuerPfad

Ich denke, mit AWK kann man sich vielleicht den Dateinamen im grep Rückgabewert auschneiden und weiterverwenden für den cp befehl, ich weiss aber nicht genau wie.

Kann hier vllt jmd aushelfen?

Danke!

Hi,

schau mal in die Dokumentation von grep nach, Du kannst die Ausgabe extrem anptassen. Statt awk sollte das cut-Kommando ausreichen.

Es ist besonders stabil, eine while-read-Schleife zu verwenden

grep …|while read name rest; do name=cut ... $name; … done

Gruß, Lutz

Hi,

Also mit folgender Zeile bekomme ich schonmal den Dateinamen als Rückgabewert angezeigt:

grep -l suchstring *201311* | cut -d ‚:‘ -f1

Wie packe ich nun einen cp Befehl davor oder dahinter?

Habe es mit

grep -l 456218862 *201311* | cut -d ‚:‘ -f1 | cp …/anderer_ordner

und

cp …/anderer_order | grep -l 456218862 *201311* | cut -d ‚:‘ -f1

versucht, beides ging nicht :frowning:

Eine Idee?

grep -l suchstring *201311* | cut -d ‚:‘ -f1|while read f junk; do cp $f …/anderer_ordner; done

LL

Klappt leider noch nicht. Nutze ich deine Eingabe wird nichts kopiert. Einzig das Wort vor jeder Kommandozeile (eigentlich bash-3.00$) verschwindet, und nur noch eine > steht dort. :frowning:

Hallo Seboo,

cd ;  cp   ls **       #   `  -> back-quote-Zeichen

Hallo,

  1. In ein bestimmtes Verzeichnis wechseln

Beispiel: Verzeichnis „Quelle“

  1. Mittels Grep Befehl einen Dateinamen finden

Beispiel: Datei enthält „Muster“

  1. Mit dem Dateinamen und dem cp Befehl die Datei verschieben

Beispiel: Zielverzeichnis „Ziel“
Übrigens: mit cp kopierst Du, mit mv verschiebst Du.

Wenn immer genau eine Datei mit „Muster“ in dem Verzeichnis ist, dann reicht zum Verschieben ein

mv "$(grep -l Quelle/\* Muster)" Ziel/

Wenn mehrere Dateien (mindestens eine) verschoben werden sollen und keine Leerzeichen im Pfad sind, dann reicht ein

mv $(grep -l Quelle/\* Muster) Ziel/

Ansonsten führt

grep -l Quelle/\* Muster | while read f; do mv "$f" Ziel/;done

zum gewünschten Ergebnis.

Das grep -l gibt ausschließlich den Dateinamen der Treffer aus, Du brauchst also nicht ab einem : abzuschneiden.

Viele Grüße
Diether

Hallo,

damit hast Du im Wesentlichen meine letzte Antwort vom 12.11. wiederholt und etwas vereinfacht.

Wenn man das ausprobiert, sollte man beachten, dass in den Argumenten von grep zuerst das Muster, dann der Dateinamen steht.

Gruß, Lutz

Hallo Lutz,

Wenn man das ausprobiert, sollte man beachten, dass in den
Argumenten von grep zuerst das Muster, dann der Dateinamen
steht.

stimmt, ich habe die Argumente in der falschen Reihenfolge angegeben.

damit hast Du im Wesentlichen meine letzte Antwort vom 12.11.
wiederholt und etwas vereinfacht.

Insbesondere habe ich den unnötigen cut-Befehl entfernt, der ist beim Verwenden von -l nicht nötig, da sowieso nur der Dateiname ausgeben wird.

Gruß
Diether