Suchen und ersetzen in Files während Kopiervorgang

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
kamelot
Beiträge: 3
Registriert: 01.09.2013 15:45:01

Suchen und ersetzen in Files während Kopiervorgang

Beitrag von kamelot » 01.09.2013 16:07:18

Hallo Miteinander

Ich versuche momentan folgendes Skript zu erweitern. Das Skript kopiert momentan nacheinander Files vom Vortag welche ein bestimmtes Pattern enthalten (zuerst Files beginnend mit data* danach Files beginnend mit envl*) via scp vom einem Quell- in ein Zielverzeichnis.

Code: Alles auswählen

for pattern in 'data*' 'envl*'; do
  find /appl/geresAdapter/sent -type f -daystart -mtime 1 -name "$pattern" \
    -exec egrep -lZ '>1-4(001|021|045|141|034|258)-1<' {} +
done | xargs -r0 bash -c 'scp -p -q "$@" geres@svuaf015:/appl/sedexAdapter_aux/inbox' --
Zusätzlich möchte ich im Skript einbauen, dass das Pattern >2-AG-1< in den bisher identifizierten Quell-Files gefunden und durch das Pattern >T2-AG-1< ersetzt und die entsprechenden Files mit dem neuen Pattern ins Ziel-Verzeichnis kopiert werden, ohne dass dabei die Quell-Files verändert werden. Habe den halben Nachmittag Lösungen mit dem Kommando "sed" ausprobiert und komme leider nicht auf die korrekte Lösung.

Besten Dank im Voraus für eure Unterstützung.

Kamelot

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Suchen und ersetzen in Files während Kopiervorgang

Beitrag von Cae » 01.09.2013 16:36:47

Vielleicht

Code: Alles auswählen

... done | xargs -r0I'{}' sh -c '
	sed "s/>2-AG-1</>T2-AG-1</g" <"{}" \
	| ssh geres@svuaf015 "cat >/appl/sedexAdapter_aux/inbox/"\
"$(printf "%s" "{}" | sed "s,/appl/geresAdapter/sent,,")"
'
? Ungetestet, wird vorhandene Zieldateien kommentarlos ueberschreiben, aber sollte das Gewuenschte tun. Berechtigungen werden nicht mit uebertragen, es wird die umask des Zielsystems verwendet. Die Subshell mit sed ist notwendig, um den absoluten Pfad-Anteil abzutrennen; man wuerde sich das mit cd /appl/geresAdapter/sent; find . -type... sparen.

Willkommen im Forum!

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

kamelot
Beiträge: 3
Registriert: 01.09.2013 15:45:01

Re: Suchen und ersetzen in Files während Kopiervorgang

Beitrag von kamelot » 01.09.2013 18:09:11

Hallo Cae

Danke und danke auch für die Unterstützung.

Ich habe Deinen Lösungsvorschlag versucht in meiner Testumgebung umzusetzen. Leider jedoch ohne Erfolg.

Code: Alles auswählen

12 datum=`date  --date="today" "+%F"`
13
14 for pattern in 'data*' 'envl*'; do
15 find /home/test/skripts/quell -type f -daystart -mtime 0 -name "$pattern" \
16     -exec egrep -lZ '>1-4(271)-1<' {} +
17 done | xargs -r0I '{}' sh -c sed "s/>2-AG-1</>T2-AG-1</g" <"{}" \
18 | "cat >/home/test/skripts/ziel/" \
19 "$(printf "%s" "{}" | sed "s,/home/test/skripts/quell,,")"
Bei der Ausführung des Skripts erhalte ich nachfolgende Fehlermeldung:

linux-hn58:/home/test/skripts # ./test.sh
./test.sh: line 17: {}: No such file or directory
./test.sh: line 19: cat >/home/test/skripts/ziel/: No such file or directory
find: `egrep' terminated by signal 13
find: `egrep' terminated by signal 13

Werde heute Abend nochmals darüber brüten.

Gruss Kamelot

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Suchen und ersetzen in Files während Kopiervorgang

Beitrag von Cae » 01.09.2013 18:20:30

Die Ticks ' um das -c-Argument von sh sind wichtig, vergleiche

Code: Alles auswählen

$ printf 'test\0foo\0bar\0' | xargs -r0I '{}' sh -c echo "{}" | cat -A
$
$
$
$ printf 'test\0foo\0bar\0' | xargs -r0I '{}' sh -c 'echo "{}"' | cat -A
test$
foo$
bar$
$ 
(Wegen dem fehlenden ssh user@host sag' ich mal nichts, das wird zum Testen sein.)

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

andy789
Beiträge: 1
Registriert: 02.09.2013 11:53:21

Re: Suchen und ersetzen in Files während Kopiervorgang

Beitrag von andy789 » 02.09.2013 11:56:15

Ich mag deine Art die Meinung und die gemeinsame Nutzung der Informationen. :hail: :google:
Our 642-533 tutorials and braindump guide will give beginners a core overview of Adobe photoshop. Learn all about photoshop plugins using 312-50v8 braindumps free resources.For more details about this product visit wikipedia and also see on Youtube ,best wishes.

kamelot
Beiträge: 3
Registriert: 01.09.2013 15:45:01

Re: Suchen und ersetzen in Files während Kopiervorgang

Beitrag von kamelot » 02.09.2013 20:31:16

Hallo Miteinander

Ich habe heute nochmals zusammen mit einem Kollegen über dem Script gebrütet. Folgende Lösung welche ich euch selbstverständlich nicht vorenthalten möchte ist dabei rausgekommen.

Code: Alles auswählen

#!/bin/bash

target="/appl/work/tempverzeichnis"
datum=`date  --date="yesterday" "+%F"`
transferdate=`date +"%Y%m%d"`

for pattern in 'data*' 'envl*'; do
  find /appl/geresAdapter/sent -type f -daystart -mtime 4 -name "$pattern" -exec egrep -lZ '>1-4(289)-1<' {} +
done | xargs -0 > $target/temp.txt

files=`cat $target/temp.txt`

for datei in $files; do
        dateiname=`basename $datei`
        cp -p $datei $target/$dateiname
        sed -i "s/>2-AG-1</>T2-AG-2</g" $target/$dateiname
done

datas=`ls -1 $target/data*`
for pattern in $datas; do
        echo $pattern
done | xargs -r bash -c 'scp -p -q "$@" test@svuafxxx:/appl/interfaces_ktag/xxx/inbox/test' --

envl=`ls -1 $target/envl*`
for pattern in $envl; do
        echo $pattern
done | xargs -r bash -c 'scp -p -q "$@" test@svuafxxx:/appl/interfaces_ktag/xxx/inbox/test' --

cd $target
rm *.xml
- Die gewünschten Files werden identifiziert und deren Filename in einem Temp-Verzeichnis in einem Temp-File abgelegt
- Die Files werden danach ins Tempverzeichnis kopiert und das entsprechende Pattern via sed gesucht und durch das Neue ersetzt.
- Danach werden sämtliche data* -Files sowie sämtliche envl* -Files nacheinander via scp auf den Zielserver kopiert.

Besten Dank an alle für eure Unterstützung.
Viele Grüsse
Kamelot

Antworten